整形變量與字節數組的相互轉換

今天讀寫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
=====================================================

呵呵,就是這樣搞定的!

據說光棍節要到了,還是脫離光棍組織的好 ... 72_72.gif  coffee.gif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章