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),因此我粘贴在这个答案的第一个片段中的代码.
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)
这将"酷字符串"输出到控制台.
这很简单.
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)
什么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
| 归档时间: |
|
| 查看次数: |
583880 次 |
| 最近记录: |