Java Byte Array to String to Byte Array

090*_*9EM 173 java string byte

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

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

Arrays.toString(data.toByteArray())
Run Code Online (Sandbox Code Playgroud)

要发送的字节..

[B@405217f8
Run Code Online (Sandbox Code Playgroud)

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

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Run Code Online (Sandbox Code Playgroud)

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

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Run Code Online (Sandbox Code Playgroud)

服务器应将此数据返回给客户端,以便进行验证.

我的客户端收到的响应(作为字符串)看起来像

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Run Code Online (Sandbox Code Playgroud)

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

无论我似乎尝试什么,我最终得到一个字节数组,看起来如下......

[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]
Run Code Online (Sandbox Code Playgroud)

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

B@2a80d889
Run Code Online (Sandbox Code Playgroud)

这两个都与我发送的数据不同......我确信我错过了一些非常简单的东西....

有什么帮助?!

Yan*_*hon 266

你不能只接受返回的字符串并从中构造一个字符串...它不再是一种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);
Run Code Online (Sandbox Code Playgroud)

**编辑**

你在问题中得到了一个问题的提示,你说" 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";
Run Code Online (Sandbox Code Playgroud)

如您所见,s1保持数组 的字符串表示形式b1,同时s2保存包含在其中的字节的字符串表示形式b1.

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

  • 惊人的!我想你已经完全理解我想要的是什么了......我不是来自Java背景,所以我无法真正弄清楚我需要的转换。仅供参考,我将 s1 发送到服务器,服务器正在回复 s1 (我可以验证服务器是否收到并回复 s1 中的数据),所以我确实需要与 Arrays.toString() 相反的操作你建议...而且你的解决方案非常好!干杯! (2认同)
  • 添加到正确(尽管不完整)的答案:1)在Java中转换为字符串的任何byte []数组应指定字符集.byte []数组是UTF-8还是其他什么?不具体或知道它是什么可以创建错误.2)Java使用Big-Endian编码,但M $系统使用Little-Endian.在处理字符串(基于字符)的byte []数组时,没有问题.但是,如果byte []数组表示数字,则源/目标系统的"endianess"很重要. (2认同)

Cor*_*han 127

String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);
Run Code Online (Sandbox Code Playgroud)

这将"酷字符串"输出到控制台.

这很简单.

  • 甚至可能是问题的错误回答,但它帮助我解决了问题.这就是为什么人们在降级别人的回复之前应该多考虑一下.谢谢CorayThan! (12认同)
  • @CorayThan实际上没有,这根本没有解决OP的问题.如果你实际读过它,你会发现他接收的`byte []`表示为`String`; 即``[97,98,99]"`不是`[97,98,99]`.意思是,你的答案甚至不适用于这种情况. (9认同)
  • 如此多的downvotes,但很少解释...我说的不起作用?它在我使用它时起作用,问题是如何从字节转换为字符串然后再转回,对吧? (6认同)
  • 解决这个问题的答案实际上标志着答案.从记忆中看,它并不像你建议的那样简单......看看Yanick的回答,我认为你误解了我的要求,但感谢你的投入. (2认同)
  • 你的答案是`String`到`byte []`到`String`.我认为问题要求是`byte []`到`String`到`byte []`. (2认同)
  • 我是根据问题主题来到这个线程的,这个答案完全回答了这个问题。OP 在问题正文中的情况不同这一事实是不同的讨论。 (2认同)

Nee*_*n.Z 21

我做了什么:

回到客户:

byte[] result = ****encrypted data****;

String str = Base64.encodeBase64String(result);

return str;
Run Code Online (Sandbox Code Playgroud)

从客户收到:

 byte[] bytes = Base64.decodeBase64(str);
Run Code Online (Sandbox Code Playgroud)

您的数据将以以下格式传输:

OpfyN9paAouZ2Pw+gDgGsDWzjIphmaZbUyFx5oRIN1kkQ1tDbgoi84dRfklf1OZVdpAV7TonlTDHBOr93EXIEBoY1vuQnKXaG+CJyIfrCWbEENJ0gOVBr9W3OlFcGsZW5Cf9uirSmx/JLLxTrejZzbgq3lpToYc3vkyPy5Y/oFWYljy/3OcC/S458uZFOc/FfDqWGtT9pTUdxLDOwQ6EMe0oJBlMXm8J2tGnRja4F/aVHfQddha2nUMi6zlvAm8i9KnsWmQG//ok25EHDbrFBP2Ia/6Bx/SGS4skk/0couKwcPVXtTq8qpNh/aYK1mclg7TBKHfF+DHppwd30VULpA== 
Run Code Online (Sandbox Code Playgroud)


Kal*_*Kal 7

什么Arrays.toString()是在byteArray中创建每个字节的字符串表示.

请查看API文档 Arrays API

要将响应字符串转换回原始字节数组,必须使用split(",")或者将其转换为集合,然后将其中的每个项目转换为字节以重新创建字节数组.


小智 5

它简单地将字节数组转换为字符串,并将字符串转换回java中的字节数组.我们需要知道何时以正确的方式使用"新".它可以如下完成:

字节数组转换为字符串:

byte[] bytes = initializeByteArray();
String str = new String(bytes);
Run Code Online (Sandbox Code Playgroud)

字符串到字节数组转换:

String str = "Hello"
byte[] bytes = str.getBytes();
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看:http: //evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html

  • 不,你没有读过这个问题,或者你可能没有理解这个问题.你会注意到这个问题在几年前被回答了...... (2认同)