Bootstrap

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
         

到这大部分就解释完了,如果有你们认为不恰当的地方,欢迎留言,加油!

;