Java 字节数组到字符串到字节数组

2022-08-31 06:29:09

我正在尝试理解字节[]到字符串,字符串表示byte[]到byte[]的转换...我将我的byte[]转换为要发送的字符串,然后我希望我的Web服务(用python编写)将数据直接回显回客户端。

当我从我的 Java 应用程序发送数据时...

Arrays.toString(data.toByteArray())

要发送的字节数..

[B@405217f8

发送(这是Arrays.toString()的结果,它应该是我的字节数据的字符串表示,此数据将通过网络发送):

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

在python方面,python服务器向调用方返回一个字符串(我可以看到它与我发送到服务器的字符串相同)

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

服务器应将此数据返回到客户端,并在客户端中进行验证。

我的客户端收到的响应(以字符串形式)如下所示

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

我似乎无法弄清楚如何将接收到的字符串恢复为字节[]

无论我似乎尝试什么,我最终都会得到一个字节数组,如下所示...

[91, 45, 52, 55, 44, 32, 49, 44, 32, 49, 54, 44, 32, 56, 52, 44, 32, 50, 44, 32, 49, 48, 49, 44, 32, 49, 49, 48, 44, 32, 56, 51, 44, 32, 49, 49, 49, 44, 32, 49, 48, 57, 44, 32, 49, 48, 49, 44, 32, 51, 50, 44, 32, 55, 56, 44, 32, 55, 48, 44, 32, 54, 55, 44, 32, 51, 50, 44, 32, 54, 56, 44, 32, 57, 55, 44, 32, 49, 49, 54, 44, 32, 57, 55, 93]

或者我可以得到一个字节表示,如下所示:

B@2a80d889

这两者都与我发送的数据不同...我敢肯定我错过了一些真正简单的东西....

任何帮助?!


答案 1

你不能只是获取返回的字符串并从中构造一个字符串...它不再是一种数据类型,它已经是一个字符串;你需要解析它。例如:byte[]

String response = "[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]";      // response from the Python script

String[] byteValues = response.substring(1, response.length() - 1).split(",");
byte[] bytes = new byte[byteValues.length];

for (int i=0, len=bytes.length; i<len; i++) {
   bytes[i] = Byte.parseByte(byteValues[i].trim());     
}

String str = new String(bytes);

** 编辑 **

您在问题中得到了问题的提示,您说“”,因为 是 的字节值,所以字符串 “” 字符串的字节数组也是如此。Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ...91[[91, 45, ...[-45, 1, 16, ...

该方法将返回指定数组的表示形式;这意味着返回的值将不再是数组。例如:Arrays.toString()String

byte[] b1 = new byte[] {97, 98, 99};

String s1 = Arrays.toString(b1);
String s2 = new String(b1);

System.out.println(s1);        // -> "[97, 98, 99]"
System.out.println(s2);        // -> "abc";

如您所见,保存数组的字符串表示形式,而保存 中包含的字节的字符串表示形式。s1b1s2b1

现在,在您的问题中,您的服务器返回一个类似于 的字符串,因此要取回数组表示形式,您需要相反的构造函数方法。如果 是 相反的,你需要找到相反的,因此我粘贴在这个答案的第一个片段中的代码。s1s2.getBytes()new String(b1)Arrays.toString(b1)


答案 2
String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

这将输出“酷字符串”到控制台。

这很容易。