Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java字符串的字节数组_Java字节数组到字符串到字节数组

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

作者头像
用户7886150
修改于 2021-04-29 06:42:38
修改于 2021-04-29 06:42:38
5.4K0
举报
文章被收录于专栏: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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#字符串、字节数组和内存流间的相互转换
定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串=>比特数组 (1)byte[] bt=System.Text.Encoding.Default.GetBytes("字符串"); (2)byte[] bt=Convert.FromBase64String("字符串"); 补充: System.Text.Encoding.Unicode.GetBytes(str); System.Text.Encoding.UTF8.GetBytes(str); System.Text.Encod
跟着阿笨一起玩NET
2018/09/20
2K0
Thrift 对象序列化、反序列化-字节数组分析
本篇博客仅分析Thrift对象的序列化、反序列化的字节数组,以及Thrift对象的序列化、反序列化原理。其他源码分析会另开章节~
Yano_nankai
2018/12/19
3.3K0
PHP字符串与字节转换示例「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112099.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/11
1.1K0
深入探索JavaSE字符编码的奥秘
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2023/12/27
1790
深入探索JavaSE字符编码的奥秘
RandomAccessFile&IO流&排序&方法论
RandomAccessFile&IO流&排序&方法论 我们总觉得历史是极其遥远的东西,与我们并无关联,又觉得历史隐藏在图书馆的旧书之中。 然而,我们每个人都有真真切切的历史。那便是每日的历史。今天自己做了些什么,又是怎么做的,都会成为你历史中的一页。 是畏缩不前、碌碌无为,还是勇猛挑战,花心思比昨天做的更好。每种态度,都会写就属于你的历史。 ——尼采 《快乐的知识》 RandomAccessFile 以下是昨天对RandomAccessFile的具体练习: 1 package Zhang; 2
拾点阳光
2018/05/11
5970
JavaSE(十二)之IO流的字节流(一)
前面我们学习的了多线程,今天开始要学习IO流了,java中IO流的知识非常重要。但是其实并不难,因为他们都有固定的套路。 一、流的概念       流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以"流"的方式进行。设备可以是文件,网络,内存等       流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,我们成为输出流,如果数据的流向是设备至程序称为输入流。       数据以二进制的形式在程序与设备之间流动传输,就
用户1195962
2018/01/18
9390
JavaSE(十二)之IO流的字节流(一)
Java进阶-IO(2)
话接上回,继续java IO部分的学习。上一次说完了字节流的读写数据,这次介绍一下字符流的读写数据。
reload
2024/03/03
1930
java byte转16进制字符串_Java字节数组转换成十六进制字符串的几种方法
最近在项目中需要将字节数组转换成十六进制字符串,而Java内置的库中并没有相关工具可用,因此查了一下byte数组转hex字符串的相关方法,列出如下,需要可以直接拿来使用。
用户7886150
2021/04/29
4.8K0
别在逻辑处理字符串了,String类的常用方法都有
在开发过程中像获取字符串长度、字符串截取、字符串转数组这样的方法我们常用会很熟悉,但是有很多实用方法我们并不了解。
余生大大
2022/11/02
6080
Netty5学习笔记(3) ---Protobuf序列化
1.protocol buff是一种协议,是谷歌推出的一种序列化协议;Java序列化协议也是一种协议
挽风
2021/04/13
2640
Java实用类(三)-String
​ String底层是由私有final的数组实现的,对外没有提供修改的方法,字符串多次赋值,不是修改字符串的内容,而是改变字符串的引用地址;
化羽羽
2022/10/28
3470
go 字符串
要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。
Michel_Rolle
2021/02/04
2.6K0
JavaUtil_01_MD5加密
昨天做java微信开发,引用百度翻译API给公众号添加翻译功能时,需要使用MD5生成签名。注意,使用MD5生成签名后一定要转成小写,不然百度翻译后台不会认你这个签名的,会报无效签名的错误。
shirayner
2018/08/10
6920
内置函数 -- bytes -- 字节码与字符串相互转换
1. 返回值为一个新的不可修改字节数组,每个数字元素都必须在0 - 255范围内,是bytearray函数的具有相同的行为,差别仅仅是返回的字节数组不可修改。
用户7798898
2020/09/27
1.1K0
java_String类、StringBuilder类、Arrays类、Math类的使用
java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例
咕咕星
2020/08/19
1.1K0
java_String类、StringBuilder类、Arrays类、Math类的使用
深入理解字符串和字节数组转换
      前文中,论及字符串和字节数组的转换,虽然能够找到某个代码页,保证转换的可逆,但是在实际处理中,仍然还有一些细节问题需要注意.       最重要的,就是转换得到的字符串,每个字符的编码和原来的编码可能并不相同,以代码页437为例,127以下的,转换后的字符和转换前的一样,而后面的就完全不同了。下面是437代码页的转换字符和原来内码的对照表。 -             c     {维数:[256]} int[]               [0]   0     int           
用户1075292
2018/01/23
9510
javaIO流之字节流
在java中io流分为字节流和字符流。字节流和字符流分别对应相应的读取和写入操作。整体的功能就是实现对输入输出的操作。
兰舟千帆
2022/07/16
3220
javaIO流之字节流
笔记75 | Java字节、十进制、十六进制、字符串之间的相互转换
/* * 字节转10进制 */ public static int byte2Int(byte b){ int r = (int)b; return r; } /* * 10进制转字节 */ public static byte int2Byte(int i){ byte r = (byte)i; return r; } /* * 字节数组转16进制字符串 */ public static String bytes2Hex
项勇
2018/06/19
1.6K0
字节数组和short,int,float,double等类型的相互转换
在进行Modbus协议通信和网络编程时,有时需要将从串口或者网络中接收的数据从字节数组转换成对应的int,float,double等数据,有时还要考虑大小端字节序以及Swap的问题,发现在C++中需要自己写相关的转换函数,于是/写了一个函数,用于从输入的byte数组中获取指定类型的数据,目前支持int16,int32,int64,float,double,对应的代码如下:
ccf19881030
2020/03/18
5.7K0
加密与安全_探索常用编码算法
计算机加密技术旨在实现上述目标。现代计算机密码学建立在严格的数学理论基础上,并逐渐发展成为一门科学。对于大多数开发者来说,设计安全的加密算法是一项艰巨的任务,验证加密算法的安全性则更加困难。目前认为安全的加密算法也只是尚未被攻破。因此,为了编写安全的计算机程序,我们应遵循以下原则:
小小工匠
2024/05/26
1730
加密与安全_探索常用编码算法
推荐阅读
相关推荐
C#字符串、字节数组和内存流间的相互转换
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档