我期待这个:
ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == 222
但以下情况属实:
ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == -570425344
如何使用签名/无符号类型解决Java的另一个限制,或者我是否需要完全自行滚动?
答案 0 :(得分:5)
代码:
public static void main(String[] args) {
ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
System.out.println(bb.order());
System.out.println(bb.getInt() == 222);
bb.rewind();
bb.order(ByteOrder.LITTLE_ENDIAN);
System.out.println(bb.order());
System.out.println(bb.getInt() == -570425344);
}
控制台:
BIG_ENDIAN
true
LITTLE_ENDIAN
true
附录:供参考,“新创建的字节缓冲区的顺序始终为BIG_ENDIAN
。” - ByteBuffer#order()
答案 1 :(得分:3)
您观察到的结果对于小端机器是正确的。我怀疑如果你运行以下内容,你将得到LITTLE_ENDIAN
作为答案。
ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
System.out.println(bb.order());
如果要强制缓冲区使用big-endian排序,请执行以下操作:
ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
bb.order(ByteOrder.BIG_ENDIAN);
System.out.println(bb.order());
System.out.println(bb.getInt( ));
应打印出来:
BIG_ENDIAN
222