繁体   English   中英

Java ByteBuffer发出有符号和无符号类型的问题,将字节数组转换为整数

[英]Java ByteBuffer issues with signed and unsigned types converting byte array to integer

我期待这个:

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

如果要强制缓冲区使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM