【问题标题】:Issue replicating byte string in Java with ByteBuffer使用 ByteBuffer 在 Java 中复制字节字符串的问题
【发布时间】:2015-10-11 00:06:15
【问题描述】:

我正在尝试在 Java 中复制我在 Objective-C(在 iOS 上)中生成的字节字符串,但遇到了麻烦。这是我要生成的字符串:

"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

我从一个包含 4 个整数的数组 - [1,1,0,0] 中获取该字符串,其中每个整数有 4 个字节。在这里查看了一堆问题后,我尝试使用ByteBuffer 在Java 中构造该字符串,如下所示:

ByteBuffer bytes = ByteBuffer.allocate(16);
bytes.putInt(1);
bytes.putInt(1);
bytes.putInt(0);
bytes.putInt(0);

String byteString = new String(bytes.array());

但是这给了我:

"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"

当我打开它时,我得到的整数数组是[16777216, 16777216, 0, 0]。显然我做错了什么,我希望有人能指出我正确的方向。

【问题讨论】:

  • 不建议使用字符串来保存字节。当您将字节数组传递给new String 时,您正在使用平台的默认字符集将这些字节解码为字符,并且对于该字符集无效的任何字节序列都将被解码为字符串“?”或“�”。这些特定字节没有这个问题,但任何高于 0x7f 的字节都可能会。

标签: java bytearray bytebuffer


【解决方案1】:

iOS 是 little-endian,因此 4 字节整数的最低有效字节在前。

Java ByteBufferdefaults to big-endian,所以正好相反。

字节缓冲区的初始顺序始终为 BIG_ENDIAN

你可以改变这个

bytes.order(ByteOrder.LITTLE_ENDIAN);

【讨论】:

  • 啊,做到了。谢谢!
【解决方案2】:

你想要的是:

ByteBuffer bytes = ByteBuffer.allocate(16);
bytes.putInt(16777216);
bytes.putInt(16777216);
bytes.putInt(0);
bytes.putInt(0);

String byteString = new String(bytes.array());

平台的字节序不同,所以当你放入4个字节时,字节会颠倒。

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多