前些天讀寫socket的時候碰到一種轉(zhuǎn)換,要在int型變量和字節(jié)數(shù)組之間進行轉(zhuǎn)換 (唉~公司定義的數(shù)據(jù)包)。As is known to all,java里邊int是4字節(jié)存儲的,于是乎想到了用移位操作來實現(xiàn),同樣也可以用移位操作將字節(jié)數(shù)組還原成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操作數(shù),默認(rèn)會將byte隱式轉(zhuǎn)換為int變量,而轉(zhuǎn)換成的int變量高24位全部為1, 比如 1000 的四個字節(jié)是 0x00H, 0x00H, 0x03H, 0xE8 , 轉(zhuǎn)換后存到字節(jié)數(shù)組中是完全正確的;不過逐個打印出來的時候,會隱式轉(zhuǎn)換為int ,如下
0x00000000H , 0x00000000H, 0xFFFFFF03H, 0xFFFFFFE8, 顯示出來就是 0 , 0 , 3, -24
接下來,在將byte數(shù)組轉(zhuǎn)換為int變量的時候,假如直接用移位操作就會有麻煩,因為高位都是FFFFFF,所以需將隱式轉(zhuǎn)換生成的FFFFFF消掉,有一招就是每個字節(jié)和0xFF相與,然后再移位,最后把各步產(chǎn)生的結(jié)果相加得到原始的int變量。
int轉(zhuǎn)換為字節(jié)數(shù)組的我就不細(xì)說了,這里把字節(jié)數(shù)組轉(zhuǎn)換為int的過程列出來
如下所示: 【1000 為例】
============================================================
原字節(jié)數(shù)組 : 0x00H, 0x00H, 0x03H, 0xE8
進行位運算的時候隱式轉(zhuǎn)換為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 所得結(jié)果相加就是我們的int變量了
結(jié)果:0x000003E8H ==> 十進制 1000
=====================================================
呵呵,就是這樣搞定的!
新聞熱點
疑難解答