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

我试图理解 byte []到 string,byte []到 byte []转换的字符串表示... 我将 byte []转换成一个字符串发送,然后期望我的 Web 服务(用 python 编写)将数据直接回送到客户端。

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

Arrays.toString(data.toByteArray())

要发送的字节. 。

[B@405217f8

Send (这是 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]

我似乎不知道如何将接收到的字符串返回到 Byte []

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

[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

这两个都不同于我发送的数据... 我肯定我错过了一些真正简单的... 。

有人帮忙吗!

623363 次浏览

您不能仅仅获取返回的字符串并从中构造一个字符串... ... 它不再是 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保存 b1中包含的 字节的字符串表示形式。

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

Arrays.toString()所做的是在 byteArray 中创建每个字节的字符串表示形式。

请查看 API 文档 数组 API

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

你能不能只发送字节作为字节,或转换每个字节的字符和发送作为一个字符串?这样做至少会占用字符串中的85个字符,而您只需要发送11个字节。您可以创建字节的字符串表示形式,所以它应该是“[ B@405217f8”,这可以很容易地在 Python 中转换为 bytesbytearray对象。否则,您可以将它们表示为包含22个字符的一系列十六进制数字(“5b42403430353231376638”) ,这可以在 Python 端使用 binascii.unhexlify()轻松解码。

如果要将字符串转换回字节数组,则需要使用 String.getBytes()(或等效的 Python 函数) ,这将允许您打印出原始的字节数组。

您从字节数组([B@405217f8)中看到的输出类型也是零长度字节数组(即 new byte[0])的输出。这个字符串看起来像是对数组的引用,而不像我们可能从常规集合的 toString()方法中期望的那样是对数组内容的描述。

与其他受访者一样,我将指向接受 byte[]参数的 String构造函数,以便从字节数组的内容构造字符串。如果希望从 TCP 连接获取字节,应该能够从套接字的 InputStream读取原始字节。

如果您已经将这些字节读取为 String(使用 InputStreamReader) ,那么可以使用 getBytes()函数将字符串转换为字节。一定要将所需的字符集传递给 String 构造函数和 getBytes()函数,这只有在字节数据可以被 InputStreamReader转换为字符时才会有效。

如果你想处理原始字节,你应该真正避免使用这个流阅读器层。

String coolString = "cool string";


byte[] byteArray = coolString.getBytes();


String reconstitutedString = new String(byteArray);


System.out.println(reconstitutedString);

将“ Cool string”输出到控制台。

非常简单。

在 java 中将字节数组转换为字符串并将字符串转换回字节数组非常简单。我们需要知道什么时候以正确的方式使用“ new”。 可以这样做:

字节数组到字符串的转换:

byte[] bytes = initializeByteArray();
String str = new String(bytes);

字符串到字节数组的转换:

String str = "Hello"
byte[] bytes = str.getBytes();

要了解更多细节,请看: Http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html

我所做的:

返还给客户:

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==

[ JDK8]

import java.util.Base64;

字符串:

String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });

字节数组:

byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");

使用下面的代码 API 将字节码作为字符串转换为字节数组。

 byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");

[ 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);

可以执行下列操作将字节数组转换为字符串,然后将该字符串转换为字节数组:

// 1. convert byte array to string and then string to byte array


// convert byte array to string
byte[] by_original = {0, 1, -2, 3, -4, -5, 6};
String str1 = Arrays.toString(by_original);
System.out.println(str1); // output: [0, 1, -2, 3, -4, -5, 6]


// convert string to byte array
String newString = str1.substring(1, str1.length()-1);
String[] stringArray = newString.split(", ");
byte[] by_new = new byte[stringArray.length];
for(int i=0; i<stringArray.length; i++) {
by_new[i] = (byte) Integer.parseInt(stringArray[i]);
}
System.out.println(Arrays.toString(by_new)); // output: [0, 1, -2, 3, -4, -5, 6]

但是要将字符串转换为字节数组,然后再将该字节数组转换为字符串,可以使用以下方法:

// 2. convert string to byte array and then byte array to string


// convert string to byte array
String str2 = "[0, 1, -2, 3, -4, -5, 6]";
byte[] byteStr2 = str2.getBytes(StandardCharsets.UTF_8);
// Now byteStr2 is [91, 48, 44, 32, 49, 44, 32, 45, 50, 44, 32, 51, 44, 32, 45, 52, 44, 32, 45, 53, 44, 32, 54, 93]


// convert byte array to string
System.out.println(new String(byteStr2, StandardCharsets.UTF_8)); // output: [0, 1, -2, 3, -4, -5, 6]

我在下列问题中也作了同样的回答: Https://stackoverflow.com/a/70486387/17364272