我正在尝试理解byte []到string,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
这些都与我发送的数据不同......我确信我错过了一些非常简单的东西......
任何帮助?!
答案 0 :(得分:259)
你不能只接受返回的字符串并从中构造一个字符串...它不再是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";
如您所见,s1
包含数组 b1
的字符串表示形式,而s2
包含字节<的字符串表示形式/ strong>包含在b1
。
现在,在你的问题中,你的服务器返回一个类似于s1
的字符串,因此要获得数组表示,你需要相反的构造方法。如果s2.getBytes()
与new String(b1)
相反,则需要找到Arrays.toString(b1)
的反面,因此我在此答案的第一个片段中粘贴了代码。
答案 1 :(得分:127)
String coolString = "cool string";
byte[] byteArray = coolString.getBytes();
String reconstitutedString = new String(byteArray);
System.out.println(reconstitutedString);
将“酷字符串”输出到控制台。
这很简单。
答案 2 :(得分:20)
我做了什么:
返回客户:
byte[] result = ****encrypted data****;
String str = Base64.encodeBase64String(result);
return str;
从客户处收到:
byte[] bytes = Base64.decodeBase64(str);
您的数据将以这种格式传输:
OpfyN9paAouZ2Pw+gDgGsDWzjIphmaZbUyFx5oRIN1kkQ1tDbgoi84dRfklf1OZVdpAV7TonlTDHBOr93EXIEBoY1vuQnKXaG+CJyIfrCWbEENJ0gOVBr9W3OlFcGsZW5Cf9uirSmx/JLLxTrejZzbgq3lpToYc3vkyPy5Y/oFWYljy/3OcC/S458uZFOc/FfDqWGtT9pTUdxLDOwQ6EMe0oJBlMXm8J2tGnRja4F/aVHfQddha2nUMi6zlvAm8i9KnsWmQG//ok25EHDbrFBP2Ia/6Bx/SGS4skk/0couKwcPVXtTq8qpNh/aYK1mclg7TBKHfF+DHppwd30VULpA==
答案 3 :(得分:7)
Arrays.toString()
所做的是创建byteArray中每个字节的字符串表示。
请查看API文档 Arrays API
要将响应字符串转换回原始字节数组,必须使用split(",")
或其他内容并将其转换为集合,然后将其中的每个项目转换为字节以重新创建字节数组。 / p>
答案 4 :(得分:5)
简单地将字节数组转换为字符串,并将字符串转换回java中的字节数组。我们需要知道何时使用&#39; new&#39;以正确的方式。 它可以按如下方式完成:
字节数组到字符串转换:
byte[] bytes = initializeByteArray();
String str = new String(bytes);
String to byte array conversion:
String str = "Hello"
byte[] bytes = str.getBytes();
有关详细信息,请查看: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html
答案 5 :(得分:3)
您从字节数组([B@405217f8
)看到的输出类型也是零长度字节数组的输出(即new byte[0]
)。看起来这个字符串是对数组的引用,而不是像常规集合的toString()
方法那样对数组内容的描述。
与其他受访者一样,我会指向接受String
参数的byte[]
构造函数,以根据字节数组的内容构造字符串。如果要从TCP连接获取字节,则应该能够从套接字InputStream
读取原始字节。
如果您已经将这些字节读作String
(使用InputStreamReader
),则可以使用getBytes()
函数将字符串转换为字节。确保将所需的字符集传递给String构造函数和getBytes()
函数,这仅在字节数据可以由InputStreamReader
转换为字符时才有效。
如果你想处理原始字节,你应该真的避免使用这个流阅读器层。
答案 6 :(得分:2)
你能不只是将字节作为字节发送,或者将每个字节转换为字符并作为字符串发送?当你只有11个字节要发送时,像你这样做将在字符串中占用至少85个字符。您可以创建字节的字符串表示,因此它是“[B @ 405217f8”,可以很容易地在Python中转换为bytes
或bytearray
对象。如果做不到这一点,你可以将它们表示为一系列十六进制数字(“5b42403430353231376638”),占用22个字符,可以使用binascii.unhexlify()
在Python端轻松解码。
答案 7 :(得分:2)
[JDK8]
import java.util.Base64;
要字符串:
String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });
到字节数组:
byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
答案 8 :(得分:1)
如果要将字符串转换回字节数组,则需要使用String.getBytes()
(或等效的Python函数),这样就可以打印出原始字节数组。
答案 9 :(得分:0)
使用以下代码API将字节码作为字符串转换为字节数组。
byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");
答案 10 :(得分:0)
[JAVA 8]
import java.util.Base64;
String dummy= "dummy string";
byte[] byteArray = dummy.getBytes();
byte[] salt = new byte[]{ -47, 1, 16, ... }
String encoded = Base64.getEncoder().encodeToString(salt);