I expected this:
ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == 222
However the following is true:
ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == -570425344
How do I get around this yet another of Java's many limitations with signed/unsigned types or do I need to completely roll my own?
Code:
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);
}
Console:
BIG_ENDIAN
true
LITTLE_ENDIAN
true
Addendum: For reference, "The order of a newly-created byte buffer is always BIG_ENDIAN
."— ByteBuffer#order()
The result you observe is correct for a little-endian machine. I suspect if you run the following, you'll get LITTLE_ENDIAN
as the answer.
ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
System.out.println(bb.order());
If you want to force big-endian ordering for your buffer, do the following:
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( ));
Should print out:
BIG_ENDIAN
222
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.