将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中的bytesbytearray对象。 如果不这样做,你可以将它们表示为一系列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...");