我想将一些整数和一些字符串转换为单字节数组然后再返回。我已经对如何进行转换做了一些研究,但我不确定它是否正确。
将字符串转换为字节数组很容易:
byte[] bytes = string.getBytes();
通过Arrays.toString()
再次将其转换回来,因为这只会创建一个字节字符串。
这是否有效:String s = new String(bytes);
?
将int转换为字节数组是这样的:
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"
更新:删除了我认为存在问题的代码。没有。
答案 0 :(得分:3)
对于每个操作,您需要确定反向操作,而不仅仅是返回正确类型的任何操作。例如,即使类型正确,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");
数组的问题是你有两条信息a length
和一些bytes
如果你只是写字节,你不再知道长度,所以你不能轻易解码它(也许是不可能的)
在您的情况下,最简单的选择是使用数据流
// 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而不是writeXxxx方法。
答案 1 :(得分:1)
Java实现这一点非常简单,因为这是一个非常常见的用例。你需要什么看起来非常像序列化。
序列化的工作方式如下:单个对象可以转换为一组字节并存储在字节数组中(通常用于写入文件或通过网络发送)。
好处是任何对象都可以通过实现标记接口(只需1行代码)来实现序列化。此外,所有Wrapper数据类型以及像ArrayList这样的String和Collections对象都是可序列化的。
提出您的问题:将您的所有数据放在一个对象中并序列化该对象。我想到了3个选项: 1.一个Object []或ArrayList(如果你知道订单肯定,那么你可以根据位置访问) 2. HashMap,(如果你可以为每个人分配名称而不是依赖于位置) 3.使用int1,int2或更有意义的名称等字段创建自己的数据类型。 (您的类应该实现Serializable)。
现在,您的所有数据都会添加到单个对象中。将这一个对象转换为字节数组,您的工作就完成了。
检查此链接以了解如何将单个对象转换为字节数组: Java Serializable Object to Byte Array
Object[] payload = new Object[]{int1, int2, int3, int4, string1, string2};
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(payload);
byte[] result = out.toByteArray(); //Done
答案 2 :(得分:0)
对于商店字符串,你必须使用像
这样的东西IntBuffer intBuffer = byteBuffer.asIntBuffer();
CharBuffer stringBuffer = byteBuffer.asCharBuffer();
然后你必须遍历char[][] string = {s1.toCharArray(),s2.toCharArray()};
上的循环
把每个字符放在stringBuffer中你需要做的更多事情就是让你的byteBuffer足以保存这些值我的朋友