有符号和无符号类型转换的字节数组的Java字节缓冲区问题整数
问题描述:
我预计:有符号和无符号类型转换的字节数组的Java字节缓冲区问题整数
ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == 222
但符合下列条件:
ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == -570425344
如何解决此得到又另一个Java的签名/未签名类型的许多限制还是我需要完全推出自己的?
答
代码:
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()
答
结果你观察到的是一个小端机器是正确的。我怀疑如果你运行以下,你会得到LITTLE_ENDIAN
作为答案。
ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
System.out.println(bb.order());
如果要强制大端排序为您的缓冲区,请执行以下操作:
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
-570425344是正确的little-endian的数学。 – Mac 2011-06-16 02:53:35