Java语言Int与byte[]互转详解分析
Posted BasicLab基础架构实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
到这大部分就解释完了,如果有你们认为不恰当的地方,欢迎留言,加油!
以上是关于Java语言Int与byte[]互转详解分析的主要内容,如果未能解决你的问题,请参考以下文章