将Java字节数组串联到字节数组
我试图理解一个字节[]string,字节表示字节[]到字节[]转换…我将字节[]转换为一个string发送,然后我期待我的web服务(用python写)将数据直接回显给客户端。
当我从我的Java应用程序发送数据…
Arrays.toString(data.toByteArray())
字节发送
[B@405217f8
发送(这是Arrays.toString()的结果,应该是我的字节数据的string表示forms,这个数据将通过线传送):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
在python方面,python服务器返回一个string给调用者(我可以看到和我发送给服务器的string一样
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
服务器应该将这些数据返回给客户端,在那里它可以被validation。
我的客户端收到的响应(以stringforms)
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
我似乎无法弄清楚如何获得收到的string回到一个字节[]
无论我似乎尝试我最终得到一个字节数组,如下所示…
[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
这两个都不同于我发送的数据…我确定我错过了一些真正简单的东西….
任何帮助?
你不能只接受返回的string,并从它构造一个string…它不是一个byte[]
数据types了,它已经是一个string; 你需要parsing它。 例如 :
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, ...
是string“ [-45, 1, 16, ...
”string的字节数组。
方法Arrays.toString()
将返回指定数组的String
表示forms; 这意味着返回的值将不再是一个数组。 例如 :
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
的string表示,而s2
保存了b1
包含的字节的string表示。
现在,在你的问题中,你的服务器返回一个类似于s1
的string,因此要返回数组expression式,你需要相反的构造方法。 如果s2.getBytes()
是new String(b1)
的反义词, Arrays.toString(b1)
需要查找Arrays.toString(b1)
的相反部分,从而将代码粘贴到此答案的第一个片段中。
String coolString = "cool string"; byte[] byteArray = coolString.getBytes(); String reconstitutedString = new String(byteArray); System.out.println(reconstitutedString);
输出“cool string”到控制台。
这很容易。
我做了什么:
返回客户:
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==
Arrays.toString()
所做的是创buildArrays.toString()
中每个单独字节的string表示forms。
请检查API文档Arrays API
要将您的响应string转换回原始字节数组,您必须使用split(",")
或其他东西,并将其转换为一个集合,然后将其中的每个单独的项目转换为一个字节重新创build您的字节数组。
它简单的转换字节数组到string和string回到在Java中的字节数组。 我们需要知道何时以正确的方式使用“新”。 它可以做到如下:
字节数组转换为string:
byte[] bytes = initializeByteArray(); String str = new String(bytes);
string到字节数组的转换:
String str = "Hello" byte[] bytes = str.getBytes();
有关更多详细信息,请参阅: http : //evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html
从字节数组( [B@405217f8
))看到的输出types也是零长度字节数组(即new byte[0]
)的输出。 它看起来像这个string是对数组的引用,而不是我们可能从常规集合的toString()
方法期望的数组内容的描述。
和其他受访者一样,我会指出你接受一个byte[]
参数的string构造函数来从字节数组的内容构造一个string。 如果您想从TCP连接中获取字节,您应该能够从套接字的InputStream
读取原始字节。
如果已经将这些字节读为String
(使用InputStreamReader
),那么可以使用getBytes()
函数将string转换为字节。 确保将所需的字符集传递给String构造函数和getBytes()
函数,并且只有在InputStreamReader
能够将字节数据转换为字符时才能使用。
如果你想处理原始字节,你应该避免使用这个stream读取器层。
你不能只是以字节的forms发送字节,或者将每个字节转换成字符并作为string发送? 像你一样做的是,当你只有11个字节要发送时,在string中占用最less85个字符。 你可以创build一个字节的string表示,所以它会是“[B @ 405217f8”,它可以很容易地转换成Python中的bytes
或bytearray
对象。 如果不这样做,你可以将它们表示为一系列hex数字(“5b42403430353231376638”),它们占用22个字符,可以使用binascii.unhexlify()
方便地在Python端进行解码。
如果要将string转换回字节数组,则需要使用String.getBytes()
(或等效的Python函数),这将允许您打印出原始字节数组。
使用下面的代码API将字节码作为string转换为Byte数组。
byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");
[JDK8]
import java.util.Base64;
string:
String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });
到字节数组:
byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");