今天讀寫socket的時候遇到一種轉換,要在int型變量和字節數組之間進行轉換 {汗~公司定義的數據包}
As is known to all,JAVA裏邊int是4字節存儲的,於是乎想到了用移位操作來實現,同樣也可以用移位操作將字節數組還原成int變量。
具體代碼如下:
-----------------------------------------------------------------------------
/*
* Created on 2004-11-5
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package converter;
/**
* @author NetSniffer
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class IntByteConvertor {
public static byte[] int2Byte(int intValue){
byte[] b=new byte[4];
for(int i=0;i<4;i++){
b[i]=(byte)(intValue>>8*(3-i) & 0xFF);
//System.out.print(Integer.toBinaryString(b[i])+" ");
//System.out.print((b[i]& 0xFF)+" ");
}
return b;
}
public static int byte2Int(byte[] b){
int intValue=0;
for(int i=0;i<b.length;i++){
intValue +=(b[i] & 0xFF)<<(8*(3-i));
//System.out.print(Integer.toBinaryString(intValue)+" ");
}
return intValue;
}
public static void main(String[] args) {
System.out.println(byte2Int(int2Byte(1000)));
}
}
----------------------------------------------------------------------------------
JAVA裏邊對於byte變量,如果操作中有int操作數,默認會將byte隱式轉換爲int變量,而轉換成的int變量高24位全部爲1, 比如 1000 的四個字節是 0x00H, 0x00H, 0x03H, 0xE8 , 轉換後存到字節數組中是完全正確的;
不過逐個打印出來的時候,會隱式轉換爲int ,如下
0x00000000H , 0x00000000H, 0xFFFFFF03H, 0xFFFFFFE8, 顯示出來就是 0 , 0 , 3, -24
接下來,在將byte數組轉換爲int變量的時候,如果直接用移位操作就會有麻煩,因爲高位都是FFFFFF,所以需將隱式轉換生成的FFFFFF消掉,有一招就是每個字節和0xFF相與,然後再移位,最後把各步產生的結果相加得到原始的int變量。
int轉換爲字節數組的我就不細說了,這裏把字節數組轉換爲int的過程列出來
如下所示: 【1000 爲例】
============================================================
原字節數組 : 0x00H, 0x00H, 0x03H, 0xE8
進行位運算的時候隱式轉換爲int : 0x00000000H , 0x00000000H, 0xFFFFFF03H, 0xFFFFFFE8
1. 0x00000000H 與0xFF相與=> 0x00000000H =>左移24位 => 0x00000000H
2. 0x00000000H 與0xFF相與=> 0x00000000H =>左移16位 => 0x00000000H
3. 0xFFFFFF03H 與0xFF相與=> 0x00000003H => 左移8位 => 0x00000300H
4. 0xFFFFFFE8H 與0xFF相與=> 0x000000E8H => 左移0位 => 0x000000E8H
將1,2,3,4 所得結果相加就是我們的int變量了
結果:0x000003E8H ==> 十進制 1000
=====================================================
呵呵,就是這樣搞定的!
據說光棍節要到了,還是脫離光棍組織的好 ...