byte 與 int 轉換
阿新 • • 發佈:2019-01-04
複習過程中,遇到的不太理解的地方
(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;
}