【问题标题】:Converting ints and strings into byte array and the reverse将整数和字符串转换为字节数组,反之亦然
【发布时间】:2014-02-23 08:43:45
【问题描述】:

我想将一些整数和一些字符串转换为单字节数组,然后再转换回来。我已经对如何进行转换进行了一些研究,但我不确定它是否都正确。

将字符串转换为字节数组很简单:
byte[] bytes = string.getBytes();

通过Arrays.toString() 再次将其转换回来,因为这只会创建一个字节字符串。

这行得通吗:String s = new String(bytes);

将整数转换为字节数组是这样的:

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"

更新:删除了我认为有问题的代码。没有。

【问题讨论】:

  • 如果你捕捉到一个异常,打印它并假装它没有发生是没有意义的。如果你不捕获 IOException,你的代码会更简单,除非你知道如何处理它。

标签: java arrays string int byte


【解决方案1】:

对于每个操作,您需要确定反向操作,而不仅仅是返回正确类型的任何操作。例如,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 方法。

【讨论】:

  • 你能不能也举个反面的例子?数据是否仍会保持相同的顺序,因为我知道哪个对象是哪个对象很重要。
  • 是的,订单将被保留。如果你写一个 int 和一个 string,你应该读一个 int 和一个 string。既然您知道可以使用哪些类,就应该阅读 javadoc。
  • 谢谢。另外,应该是baos.toByteArray(); 而不是bytes
  • @RiThBo:您正在向流中写入一个 int,即数据数组的 length,即 3。显然,当从流,你回来了 3.
  • 是的。非常感谢!
【解决方案2】:

Java 使实现这一点变得非常简单,因为这是一个非常常见的用例。你需要的看起来很像序列化。

序列化的工作方式如下:单个对象可以转换为一组字节并存储在字节数组中(通常用于写入文件或通过网络发送)。

好处是任何对象都可以通过实现标记接口(只需 1 行代码)变得可序列化。此外,所有 Wrapper 数据类型以及 String 和 Collections 对象(如 ArrayList)都是可序列化的。

提出您的问题:将所有数据放在一个对象中并序列化该对象。我想到了 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

【讨论】:

    【解决方案3】:

    对于存储字符串,您也必须使用类似

    IntBuffer intBuffer = byteBuffer.asIntBuffer();
    CharBuffer stringBuffer = byteBuffer.asCharBuffer();
    

    那么你必须遍历char[][] string = {s1.toCharArray(),s2.toCharArray()};上的循环 将每个字符放入 stringBuffer 中,您需要做的更多事情是让您的 byteBuffer 足以容纳这些值,我的朋友

    【讨论】:

    • 我建议你试试这个,因为你解决的问题会越来越多。比如位置不对,长度不存储。
    • @Peter Lawrey,是的,他必须增加职位谢谢提醒我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多