前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java字符串的字节数组_Java字节数组到字符串到字节数组

java字符串的字节数组_Java字节数组到字符串到字节数组

作者头像
用户7886150
修改2021-04-29 14:42:38
5.1K0
修改2021-04-29 14:42:38
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Java程序将文件转换为字节数组,反之亦然

我正在尝试将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...");

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档