我預計:有符號和無符號類型轉換的字節數組的Java字節緩衝區問題整數
ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == 222
但符合下列條件:
ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == -570425344
如何解決此得到又另一個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