1. 程式人生 > >Int與byte[]互轉詳解分析

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
         

 

到這大部分就解釋完了,如果有你們認為不恰當的地方,歡迎留言,加油!