使用 ByteBuffer 在 Java 中发布复制字节字符串
Issue replicating byte string in Java with ByteBuffer
我正在尝试在 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]
。显然我做错了什么,我希望有人能指出我正确的方向。
你想要的是:
ByteBuffer bytes = ByteBuffer.allocate(16);
bytes.putInt(16777216);
bytes.putInt(16777216);
bytes.putInt(0);
bytes.putInt(0);
String byteString = new String(bytes.array());
各个平台的字节顺序不同,所以当你放入4个字节时,字节是颠倒的。
iOS 是小尾数法,因此 4 字节整数的最低有效字节在前。
JavaByteBuffer
defaults to big-endian,所以相反。
The initial order of a byte buffer is always BIG_ENDIAN
您可以通过
更改此设置
bytes.order(ByteOrder.LITTLE_ENDIAN);
我正在尝试在 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]
。显然我做错了什么,我希望有人能指出我正确的方向。
你想要的是:
ByteBuffer bytes = ByteBuffer.allocate(16);
bytes.putInt(16777216);
bytes.putInt(16777216);
bytes.putInt(0);
bytes.putInt(0);
String byteString = new String(bytes.array());
各个平台的字节顺序不同,所以当你放入4个字节时,字节是颠倒的。
iOS 是小尾数法,因此 4 字节整数的最低有效字节在前。
JavaByteBuffer
defaults to big-endian,所以相反。
The initial order of a byte buffer is always BIG_ENDIAN
您可以通过
更改此设置bytes.order(ByteOrder.LITTLE_ENDIAN);