我正在尝试将byte []转换为字符串,将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
两者都与我发送的数据不同...我确定我缺少真正简单的东西...
有帮助吗?
您不能只使用返回的字符串并从中构造一个字符串……它不再是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
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)的对立面,因此我将代码粘贴到了此答案的第一段中。
真棒!我想您已经完全了解我所追求的...我不是从Java背景出发的,所以我真的无法弄清楚我需要的转换。只是为了提供信息,我将s1发送到服务器,并且服务器正在用s1答复(我可以验证服务器是否已接收并回复了s1中的数据),所以我确实需要您建议的Arrays.toString() ...而且您的解决方案相当不错!干杯!
谢谢亚尼克。但是它为每个图像循环2046次,因为bytes.length的值为2046。还有其他方法可以这样做吗?
如果您要接收的数据确实是人类可读的字符串,需要像我的答案中的变量response的值一样进行解析,那么很遗憾,没有其他方法。最好的方法是让您将字节作为原始数据(作为二进制)而不是字符串,甚至可能作为Base64字符串来接收,这仅需要您将其转换为基数256(二进制)值。
要添加正确的答案(尽管不完整),请执行以下操作:1)在Java中将任何byte []数组转换为String都应指定字符集。是byte []数组UTF-8还是其他?不够具体或不知道它可能造成错误。 2)Java使用Big-Endian编码,但是M $系统使用Little-Endian。处理字符串(基于字符)的byte []数组时,这没有问题。但是,如果byte []数组表示一个数字,则源/目标系统的字节顺序很重要。
String coolString ="cool string";
byte[] byteArray = coolString.getBytes();
String reconstitutedString = new String(byteArray);
System.out.println(reconstitutedString);
它将"酷字符串"输出到控制台。
真是太容易了。
这么多否决票,却没有那么多解释...我说的不行吗?当我使用它时它起作用了,问题是如何从字节转换为字符串然后再次返回,对吗?
解决该问题的答案实际上被标记为答案。从记忆中看,它并不像您建议的那么简单...参见Yanicks的答案,我认为您误解了我的要求,但感谢您的投入。
@ 0909EM当然,您发布的问题有很多解决方案。我只是发布了一个更简单的答案,我认为它也可以解决该问题。
@CorayThan实际上,这根本无法解决OP的问题。如果您真的读过它,将会看到他收到的byte[]表示为String;即"[97, 98, 99]"而不是[97, 98, 99]。意思是,您的答案甚至不适用于这种情况。
您的答案是String至byte[]至String。我认为问题要求是byte[]到String到byte[]。
@suninsky使用String到byte[]到String可以更容易地显示一个很好的示例,无论哪种方式,它都能提供您需要的所有信息。
我基于问题主题来到了这个话题,这个答案可以完全回答。 OP在问题正文中的处境不同是一个不同的讨论。
甚至可能是对所提问题的错误回答,但这有助于我解决问题。这就是为什么人们在降级别人的回答之前应该多考虑一点。谢谢CorayThan!
@CorayThan:问题的目的是将有关字节数组的内容回答为字符串,然后再返回至字节数组。尽管您的答案是正确的,但反之亦然。
我做了什么:
返回给客户:
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()的作用是在byteArray中创建每个字节的字符串表示形式。
请检查API文档
数组API
要将响应字符串转换回原始字节数组,必须使用split(",")之类的东西并将其转换为一个集合,然后将其中的每个单个项目转换为一个字节以重新创建字节数组。
在Java中将字节数组转换为字符串并将字符串转换回字节数组很简单。我们需要知道何时以正确的方式使用"新"。
可以按照以下步骤完成:
字节数组到字符串的转换:
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
不,您没有阅读该问题,或者您可能尚未理解该问题。您会注意到,问题是几年前回答的。
从字节数组([B@405217f8)看到的输出类型也是零长度字节数组(即new byte[0])的输出。看起来该字符串是对数组的引用,而不是对数组内容的描述,就像我们可能从常规集合的toString()方法中期望的那样。
与其他答复者一样,我将指出String构造函数,该构造函数接受byte[]参数以从字节数组的内容构造字符串。如果要从TCP连接获取字节,则应该能够从套接字的InputStream中读取原始字节。
如果您已经将这些字节读取为String(使用InputStreamReader),则可以使用getBytes()函数将字符串转换为字节。确保将所需的字符集传递给String构造函数和getBytes()函数,这仅在字节数据可以由InputStreamReader转换为字符时才有效。
如果要处理原始字节,则应真正避免使用此流读取器层。
[JDK8]
import java.util.Base64;
字符串:
String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });
要字节数组:
byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
您不仅可以将字节作为字节发送,还是可以将每个字节转换为字符并作为字符串发送?如果只有11个字节要发送,则按原样执行操作将在字符串中至少占用85个字符。您可以创建字节的字符串表示形式,因此它将是" [B @ 405217f8"",可以在Python中轻松地将其转换为bytes或bytearray对象。否则,您可以将它们表示为一系列十六进制数字(" 5b42403430353231376638"),它们占22个字符,可以在Python端使用binascii.unhexlify()轻松解码。
[B@405217f8是数组的Java对象ID,而不是数组的内容。对象ID当然不能"在python中轻松转换为字节或字节数组对象"。在大小上最好的办法是将byte []转换为base64字符串。
没错,我天真的假设0909EM足够了解对象(类型)地址和对象内容之间的区别。
如果要将字符串转换回字节数组,则需要使用String.getBytes()(或等效的Python函数),这将允许您打印出原始字节数组。
[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);
使用以下代码API将字节码作为字符串转换为Byte数组。
byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");