java int 4個位元組_將4個位元組轉換為int
阿新 • • 發佈:2021-11-19
一、背景
在Java手寫JVM時,需要讀取 .class
字尾的位元組碼檔案。當把位元組碼檔案以 byte[]
(位元陣列)的形式讀取到記憶體中時,陣列前四個位元組為 0xCAFEBABE
。
如何判斷我讀取的四個位元組的值等於 0xCAFEBABE
呢?
二、單個位元組轉int
2.1 正確程式碼
public class Test { public static void main(String[] args) { int ca = (byte)0xca; int fe = (byte)0xfe; int ba = (byte)0xba; int be = (byte)0xbe; System.out.println(ca); System.out.println(fe); System.out.println(ba); System.out.println(be); } }
輸出結果:
-54 -2 -70 -66
2.2 錯誤示例
int ca = 0xca; // 值為 202
2.3 錯誤原因分析
0xca
轉化為二進位制為 11001010
int
型佔4個位元組:
十進位制 | 二進位制(雙字) |
---|---|
-54 | 1111 1111 1111 1111 1111 1111 1100 1010 |
202 | 0000 0000 0000 0000 0000 0000 1100 1010 |
表格中資料的正確性,可以藉助 Windows 系統的計算器來表示:
長度佔1個位元組的byte轉化為長度為4個位元組的int,高位補充和符號位相同的值,可以保持值的不變。
如果是負數,符號位為1,擴充套件位數時,高位補1:
負數 | 原碼 | 補碼 | 擴充套件為32位補碼 | 32位原碼 | 結果 |
---|---|---|---|---|---|
-54 | 1011 0110 | 1100 1010 | 1111 1111 1111 1111 1111 1111 1100 1010 | 1000 0000 0000 0000 0000 0000 0011 0110 | -54 |
但是,如果直接宣告為整型,則直接把 1100 1010 作為低8位,剩餘高32位全是 0。
三、位元組陣列轉int
有了第二節的結論,我們這裡可以用int來表示位元組。
public class Test { public static void main(String[] args) { byte[] cafebabe = new byte[]{-54,-2,-70,-66}; int result = toInt(cafebabe); System.out.println(Integer.toHexString(result)); } private static int toInt(byte[] bytes) { int result = 0; for (int i = 0; i < 4; i++) { result <<= 8; result |= bytes[i] & 0xFF; } return result; } }
輸出結果:
cafebabe
說明這裡的 toInt
方法是正確的。