Java语言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;
}

注意:这里不知道大家有没有留意到,在byte转int的时候,每个字节都向左依次移位 0 8 16 24,他们之间用 | 运算符连接,为什么是 | 运算符连接呢?其实 | 运算符在他们之间起到了“拼接”的效果,比如 1111 0000 0000 0000 & 0000 1111 0000 0000 = 1111 1111 0000 0000,在视觉上起到了“拼接”的效果,这样我们就可以通过这种方式把 byte数组还原为 int 了(其实就是把byte数组还原为正确的int 32 位二进制表示,然后再将二进制表示形式强转为 int 表示形式就可以了),下面我也会介绍到这个运算符的作用。

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补齐

&

对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BasicLab基础架构实验室

你的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值