1. 程式人生 > 其它 >java int 4個位元組_將4個位元組轉換為int

java int 4個位元組_將4個位元組轉換為int

一、背景

在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 方法是正確的。

參考文件

《java int 4個位元組_將4個位元組轉換為int》