1. 程式人生 > >byte 與 int 轉換

byte 與 int 轉換

複習過程中,遇到的不太理解的地方

(byte)b & 0xff

byte to int

比較下面兩個

    public static int byte2Int(byte b){
        return (int)b;
    }

    public static int byte2Int(byte b){
        return (int)(b & 0xff);
    }

疑問

你肯定在想這個與操作有什麼影響嗎?

是的,有影響 。以下是我的理解

& 0xff

0xff 的功能其實是補全32位int的
byte b = 11111111 ; // 腦袋裡想的二進位制表示 -1

b & 0xff   結果是: 000...000(24個)11111111

這樣,得到的32位int值是用24個0補全的,所以我們得到的int值為 255

(int) b

沒有與操作,我們可以考慮它是如何補全32位int的:

若b表示負數,則用1補全位數,111111111...111(32個) 
此為補碼,補碼求原碼:符號為1,其餘位取反加1.
還是 -1

所以,byte轉int我們要理解是否考慮符號位。
強制型別轉換較常用。

int 轉 byte ,只需擷取int的低8位即可

可以看到& 0xff 這一操作其實是保持了byte二進位制的表示,這一特點我們後面會提到。

byte[] to int

如果說 byte 轉 int 要考慮符號位,那麼byte陣列呢(4個byte轉換1個int)

這時,我們要保持二進位制的表示,什麼意思呢

4個byte: -1 2 3 4
-1: 11111111
2 : 00000010
3 : 00000011
4 : 00000100

得到的int值為該二進位制表示拼接而成(方便理解)
11111111 00000010 00000011 00000100
值為多少,就要看高位低位了(大端小端)。

從這裡可以看出,byte 拼接的過程中可以使用 & 0xff

// byte陣列長度為4, bytes[3]為高8位
public static int bytes2Int(byte[] bytes){
        int value=0;
        value = ((bytes[3
] & 0xff)<<24)| ((bytes[2] & 0xff)<<16)| ((bytes[1] & 0xff)<<8)| (bytes[0] & 0xff); return value; }

int to byte[]

public static byte[] int2Bytes( int value )   
{   
    byte[] src = new byte[4];  
    src[3] =  (byte) ((value>>24) & 0xFF);  
    src[2] =  (byte) ((value>>16) & 0xFF);  
    src[1] =  (byte) ((value>>8) & 0xFF);    
    src[0] =  (byte) (value & 0xFF);                  
    return src;   
}