我先贴出最终转换的代码,再来进行一步一步的介绍:
/** * 将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
 

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

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信