有符号和无符号类型转换的字节数组的Java字节缓冲区问题整数

问题描述:

我预计:有符号和无符号类型转换的字节数组的Java字节缓冲区问题整数

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == 222 

但符合下列条件:

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == -570425344 

如何解决此得到又另一个Java的签名/未签名类型的许多限制还是我需要完全推出自己的?

+3

-570425344是正确的little-endian的数学。 – Mac 2011-06-16 02:53:35

代码:

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()

+0

编辑以反映@ Mac的有用评论。 – trashgod 2011-06-16 02:59:32

+0

对不起,你是对的,我并不了解ByteBuffer默认总是以big endian顺序存储字节,而不是底层平台的字节序。我正在使用英特尔(LE),所以我正在扭转它。 – 2011-06-16 03:04:10

+0

好点;我已添加以上链接供参考。 – trashgod 2011-06-16 03:16:33

结果你观察到的是一个小端机器是正确的。我怀疑如果你运行以下,你会得到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