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,是的,他必须增加位置谢谢提醒我,你能给我举一个反面的例子吗?数据的顺序是否仍然与我了解哪些是重要的一样