Java 将整数和字符串转换为字节数组及其相反形式
我想把一些整数和字符串转换成一个单字节数组,然后再转换回来。我对如何进行转换做了一些研究,但我不确定是否都正确 将字符串转换为字节数组很容易:Java 将整数和字符串转换为字节数组及其相反形式,java,arrays,string,int,byte,Java,Arrays,String,Int,Byte,我想把一些整数和字符串转换成一个单字节数组,然后再转换回来。我对如何进行转换做了一些研究,但我不确定是否都正确 将字符串转换为字节数组很容易: byte[]bytes=string.getBytes() 通过Arrays.toString()再次将其转换回来,因为这只会创建一个字节字符串 这是否有效:String s=新字符串(字节) 将整数转换为字节数组如下所示: int[] data = { int1, int2, int3 }; ByteBuffer byteBuffer = ByteB
byte[]bytes=string.getBytes()代码>
通过Arrays.toString()
再次将其转换回来,因为这只会创建一个字节字符串
这是否有效:String s=新字符串(字节)代码>
将整数转换为字节数组如下所示:
int[] data = { int1, int2, int3 };
ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 4);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(data);
byte[] my_app_state = byteBuffer.array();
但我不知道如何把它转换回来
我的目标是将4个整数和2个字符串转换成单个字节数组,然后再将它们转换回来
比如说。我有这些对象,希望将它们转换为相同的字节数组
int int1 = 1;
int int2 = 2;
int int3 = 3;
int int4 = 4;
String s1 = "mystring1"
String s2 = "mystring2"
更新:删除了我认为有问题的代码。没有。对于每个操作,您需要确定反向操作,而不仅仅是返回正确类型的任何操作。例如,n*2
的反面是m/2
而不是m-2
,即使类型正确
Arrays.toString("Hi".getBytes()) => "{ 72, 105 }"
所以你可以
text.getBytes() => new String(bytes) // if the same character encoding is used.
更好的选择是
text.getBytes("UTF-8") => new String(bytes, "UTF-8");
数组的问题是你有两条信息一个长度
和一些字节
,如果你只写字节,你就不再知道长度,因此你无法轻松解码它(可能不可能)
在您的情况下,最简单的选择是使用数据流
// buffer which grows as needed.
ByteArrayOutputStream boas = new ByteArrayOutputStream();
// supports basic data types
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(data.length);
for(int i: data) dow.writeInt(i);
// write the length of the string + the UTF-8 encoding of the text.
dos.writeUTF(s1);
dos.writeUTF(s2);
byte[] bytes = bytes.toByteArray();
要执行相反的操作,请使用InputStream和readXxxx而不是Writexxx方法 对于每个操作,您需要确定反向操作,而不仅仅是返回正确类型的任何操作。例如,n*2
的反面是m/2
而不是m-2
,即使类型正确
Arrays.toString("Hi".getBytes()) => "{ 72, 105 }"
所以你可以
text.getBytes() => new String(bytes) // if the same character encoding is used.
更好的选择是
text.getBytes("UTF-8") => new String(bytes, "UTF-8");
数组的问题是你有两条信息一个长度
和一些字节
,如果你只写字节,你就不再知道长度,因此你无法轻松解码它(可能不可能)
在您的情况下,最简单的选择是使用数据流
// buffer which grows as needed.
ByteArrayOutputStream boas = new ByteArrayOutputStream();
// supports basic data types
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(data.length);
for(int i: data) dow.writeInt(i);
// write the length of the string + the UTF-8 encoding of the text.
dos.writeUTF(s1);
dos.writeUTF(s2);
byte[] bytes = bytes.toByteArray();
要执行相反的操作,请使用InputStream和readXxxx而不是Writexxx方法 对于存储字符串,您必须使用以下内容
IntBuffer intBuffer = byteBuffer.asIntBuffer();
CharBuffer stringBuffer = byteBuffer.asCharBuffer();
然后您必须遍历char[][]string={s1.tocharray(),s2.tocharray()}上的循环代码>
要将每个字符放入stringBuffer,您需要做的更多事情是将byteBuffer设置为足以保存这些值的值,我的朋友,对于存储字符串,您必须使用
IntBuffer intBuffer = byteBuffer.asIntBuffer();
CharBuffer stringBuffer = byteBuffer.asCharBuffer();
然后您必须遍历char[][]string={s1.tocharray(),s2.tocharray()}上的循环代码>
要将每个字符放入stringBuffer中,您需要做的更多事情是将byteBuffer设置为足以保存这些值,我的朋友Java使实现这一点非常简单,因为这是一个非常常见的用例。您需要的看起来非常像序列化
序列化的工作原理如下:单个对象可以转换为一组字节并存储在字节数组中(通常用于写入文件或通过网络发送)。
好的方面是,只要实现一个标记接口(仅1行代码),任何对象都可以序列化。此外,所有包装器数据类型、字符串和集合对象(如ArrayList)都是可序列化的
关于您的问题:将所有数据放在一个对象中并序列化该对象。我想到了3个选项:
1.对象[]或ArrayList(如果您确实知道顺序,以便根据位置进行访问)
2.HashMap(如果您可以为它们中的每一个指定一个名称,而不是依赖于位置)
3.使用诸如int1、int2或更有意义的名称等字段创建您自己的数据类型。(您的类应该实现可序列化)
现在,所有数据都添加到单个对象中。将这一个对象转换为字节数组,您的工作就完成了
检查此链接以了解如何将单个对象转换为字节数组:
Java使实现这一点变得非常简单,因为这是一个非常常见的用例。您需要的看起来非常像序列化
序列化的工作原理如下:单个对象可以转换为一组字节并存储在字节数组中(通常用于写入文件或通过网络发送)。
好的方面是,只要实现一个标记接口(仅1行代码),任何对象都可以序列化。此外,所有包装器数据类型、字符串和集合对象(如ArrayList)都是可序列化的
关于您的问题:将所有数据放在一个对象中并序列化该对象。我想到了3个选项:
1.对象[]或ArrayList(如果您确实知道顺序,以便根据位置进行访问)
2.HashMap(如果您可以为它们中的每一个指定一个名称,而不是依赖于位置)
3.使用诸如int1、int2或更有意义的名称等字段创建您自己的数据类型。(您的类应该实现可序列化)
现在,所有数据都添加到单个对象中。将这一个对象转换为字节数组,您的工作就完成了
检查此链接以了解如何将单个对象转换为字节数组:
我建议你试试这个,因为你解决的问题越多,你就会产生越多的问题。例如,位置不正确,长度也不会被存储。@Peter Lawrey,是的,他必须增加位置谢谢提醒,我建议你试试,因为你解决的问题越多,你就会产生越多的问题。例如,位置不正确,长度也不会被存储。@Peter Lawrey,是的,他必须增加位置谢谢提醒我,你能给我举一个反面的例子吗?数据的顺序是否仍然与我了解哪些是重要的一样