int型與byte型數組的轉換
為了在接下來的篇章中講解用Java實現文件的歸檔和解歸檔,需要先了解一下Java中int型與byte型數組之間的相互轉換。
首先,我們先來看看int型轉換成byte型數組。
我們知道,Java中,一個int型占用4個字節,一個byte型占用1個字節,所以,對於一個int型,我們需要一個長度為4的byte型數組來對其進行存儲。
31位——24位 | 23位——16位 | 15位——8位 | 7位——0位 |
一個int型的4個字節如上圖所示,假設用來存儲的字節數組為bytes[],那么,我們可以用bytes[0]存儲int型的第一個字節(7位——0位),bytes[1]存儲int型的第二個字節(15位——8位),bytes[2]存儲int型的第三個字節(23位——16位),bytes[3]存儲int型的第四個字節(31位——24位)。具體代碼如下:
1 public static byte[] int2Bytes(int integer) 2 { 3 byte[] bytes=new byte[4]; 4 bytes[3]=(byte) integer>>24; 5 bytes[2]=(byte) integer>>16; 6 bytes[1]=(byte) integer>>8; 7 bytes[0]=(byte) integer; 8 9 return bytes; 10 }
這里需要注意的是,當你將一個int型強制類型轉換為byte型的時候,最高的三個字節會被砍掉,只留下最低的8位賦值給byte型。
接下來,我們來看一下byte型數組轉換成int型。
我們知道,計算機是以補碼的形式存放數值型數據,當我們對一個byte型進行移位操作的時候,這個byte型會先自動補全到32位(即一個int型),再進行移位操作。舉個例子:一個byte型的-1,在內存中的補碼是八個1:11111111,當我們進行移位時,(比如說左移8位),它會進行補全,而且是有符號位的補全,再左移8位,所以最后結果是:11111111 11111111 11111111 00000000,但我們因為最后在將byte型數組轉換成int型的時候,需要對數組元素使用按位或( | )操作,因此,移位結果前面的符號位如果不去除,將影響我們的運算,得出一個錯誤的結果。(上例中我們左移8位,需要將11111111 11111111 11111111 00000000去掉前面的那些1,只保留次低位上的1,即為:0000000000000000 11111111 00000000)。
我們可以先將byte數據元素與0xff(二進制的00000000 00000000 00000000 11111111)進行按位與運算( & ),再進行移位,來去除前面的符號位。byte型數組轉換成int型的代碼如下:
1 public static int bytes2Int(byte[] bytes ) 2 { 3 //如果不與0xff進行按位與操作,轉換結果將出錯,有興趣的同學可以試一下。 4 int int1=bytes[0]&0xff; 5 int int2=(bytes[1]&0xff)<<8; 6 int int3=(bytes[2]&0xff)<<16; 7 int int4=(bytes[3]&0xff)<<24; 8 9 return int1|int2|int3|int4; 10 }