Int與byte[]互轉詳解分析
我先貼出最終轉換的程式碼,再來進行一步一步的介紹:
/** * 將int數值轉換為佔四個位元組的byte陣列 * @param value * 要轉換的int值 * @return byte陣列 */ public static byte[] intToBytes(int value ) { byte[] src = new byte[4]; src[0] = (byte) (value & 0xFF); src[1] = (byte) ((value>>8) & 0xFF); src[2] = (byte) ((value>>16) & 0xFF); src[3] = (byte) ((value>>24) & 0xFF); return src; } /** * byte陣列中取int數值 * * @param src * byte陣列 * @return int數值 */ public static int bytesToInt(byte[] src) { int value; value = (int) ((src[0] & 0xFF) | ((src[1] & 0xFF)<<8) | ((src[2] & 0xFF)<<16) | ((src[3] & 0xFF)<<24)); return value; }
int
int在Java中是用32位來表示的並且佔據4個位元組,最高位是表示符號,所以真正可以表示數字的是31位。
byte
佔1個位元組,byte在Java中是用8位來表示的。資料是8位帶符號的二進位制數。在計算機中,8位帶符號二進位制數的取值範圍是[-128, 127],所以在Java中,byte型別的取值範圍也是[-128, 127]。
運算子
java中有三種移位運算子
<< : 左移運算子,num << 1,相當於num乘以2
>> : 右移運算子,num >> 1,相當於num除以2
>>> : 無符號右移,忽略符號位,空位都以0補齊
1010 十進位制:10 原始數 num
10100 十進位制:20 左移一位 num = num << 1;
1010 十進位制:10 右移一位 num = num >> 1;
&
對兩個數進行操作,然後返回一個新的數,這個數的每個位都需要兩個輸入數的同一位都為1時才為1
A: 1111000 B: 0011100 A&B: 0011000
|
是把某兩個數中, 只要其中一個的某一位為1,則結果的該位就為1;
A: 1111001
B: 0011100
A|B: 1111001
oxff
16進位制的255,2進位制的11111111,&oxff後的作用我認為是,得到低8位
A: 11100000 101111110
0xff: 11111111
A&0xff: 101111110
二進位制知識
位移運算計算機中存的都是數的補碼,所以位移運算都是對補碼而言的
原碼
對於二進位制數,最高位為符號位,0表示正數,1表示負數,剩餘數值部分是真值。
反碼
對於二進位制數,正數的反碼就是它本身,負數的反碼除符號位外按位取反。
補碼
對於二進位制數,正數的補碼就是它本身,負數的補碼符號位取一,數值部分按位取反後末位加一。
解析
int轉byte[ ]
所以當int想轉換為byte,我們需要一個長度為4的byte型陣列來對其進行儲存。
int為4位元組所以位元組位分為0位到7位,8位到15位,16到23位,24到31位。
所以可以byte[0]儲存 0-7位 ,byte[1]儲存8-15位,byte[2]儲存16-23位,byte[3]儲存24-31位,用&0xff取對應位的資料
轉換成程式碼就是
src[0] = (byte) (value & 0xFF);
src[1] = (byte) ((value>>8) & 0xFF);
src[2] = (byte) ((value>>16) & 0xFF);
src[3] = (byte) ((value>>24) & 0xFF);
舉個例子 (value>>8) & 0xff 就是把32位的int向右移動8位 就是去掉了0到7位 再&0xff 就是擷取低8位也就是現在的8-15位,最終就是取到8-18位的資料。
a 00000000 00000000 10000000 11111111
a>>8 00000000 00000000 00000000 10000000
(a>>8)&0xff 10000000
byte[ ]轉int
Java in think中有下面一句話:
若對char,byte 或者short 進行移位處理,那麼在移位進行之前,它們會自動轉換成一個int(32位)。只有右側的5 個低位才會用到。這樣可防止我們在一個int 數裡移動不切實際的位數。
所以當我們對一個byte型進行移位操作的時候,這個byte型會先自動補全到32位,操作符的結果跟int轉byte[]類似。
操作時,相當於要把我們上面int轉byte[]時 那裡面的4個位元組又取出來重新組成一個32位的int,用運算子“與”,合併4個8位的bye(byte[0]儲存 0-7位 ,byte[1]儲存8-15位,byte[2]儲存16-23位,byte[3]儲存24-31位),也就得到最終的int數
我舉個列子
byte a 0000000 00000000 00000000 11111111
(a&0xff) 11111111
(a&0xff)<<8 0000000 00000000 11111111 00000000
到這大部分就解釋完了,如果有你們認為不恰當的地方,歡迎留言,加油!