java byte转int原理_java中int与byte数组互转代码详细分析
发布日期:2021-06-24 13:10:13 浏览次数:2 分类:技术文章

本文共 1605 字,大约阅读时间需要 5 分钟。

在java中,可能会遇到将int转成byte[]数组,或者将byte[]数组转成int的情况。下面我们来思考下怎么实现?

首先,分析int在java内存中的存储格式。

众所周知,int类型在内存中占4个字节,采用补码方式存储(假如对原码、反码、补码不熟悉,请查阅相关资料)。举例:

整型-128对应内存中的二进制值为

e3OMiCk0SLZRkcXi.png

整型128对应内存中的二进制值为

qOXGWNrphddKTq7i.png

然后,考虑如何把int类型4个字节放入byte数组中。

有两种可选方式:一是int低字节数据放置在byte数组低位置(little-endian),二是int低字节数据放置在byte数组高位置(big-endian)。两种方式都行,实际使用时,以既有约定为准。这里采用big-endian。以整型-128为例,转化后的byte数组为

pOAJpWji8xdtZp12.png

说清转化思路后,请看实现代码,如下:

public static byte[] int2Bytes(int value, int len) {

byte[] b = new byte[len];

for (int i = 0; i < len; i++) {

b[len - i - 1] = (byte)((value >> 8 * i) & 0xff);

}

return b;

}

需要说明下位操作符“>>”。>>是带符号右移,使用格式为value >> n。如果n大于value类型所占二进制位数m时(上例value为int类型,则m为32位),则右移n%m位(%取模操作符)。

注意:细心的读者可能会发现,在对value进行移位操作后,还需要跟字面量0xff(二进制 00000000 00000000 00000000 11111111)相与,即将value前3个字节都置为00000000,最后一个字节保存不变,思考下这步操作是否必要呢?

其实完全没必要,在将int强制转换成byte时,会自动丢弃前3个字节,前3个字节值是否全为0,对结果完全没影响,因此与操作完全是多余的,没有任何作用且浪费了一点点程序执行效率。

修改后代码为

b[len - i - 1] = (byte)((value >> 8 * i));

下面考虑怎么将上述byte数组反转成int。

我们的想法是,依次从byte数组中取出单个byte,对每个byte通过与及左移位操作还原成对应位置的int,最后将得各个int值相加汇总,即为所要的结果。文字可能没表达清楚,直接以整型-128转成的数组byte为例,说明如何将该byte数组反转化为整型-128。

Rbs3KSmp5uT1FXeJ.png

代码如下:

public static int bytes2Int(byte[] b, int start, int len) {

int sum = 0;

int end = start + len;

for (int i = start; i < end; i++) {

int n = ((int)b[i]) & 0xff;

n <<= (--len) * 8;

sum += n;

}

return sum;

}

请注意,上述代码中将b[i]强制转换成int,实际上属于多余操作。在进行&操作时,两个操作数会先自动转换成int类型,因此简化版代码为

int n = b[i] & 0xff;

继续思考下上面的&操作是否必要呢,能不能直接改成

int n = b[i];

答案是不行。对于单个byte类型,在java内存中占一个字节,同样是以补码方式存储。如byte型变量-1(二进制值为1111 1111),强制转换成int类型后对应的二进制值为1111 1111  1111 1111  1111 1111  1111 1111,不是我们需要的0000 0000  0000 0000  0000 0000  1111 1111因此需要跟0xff相与,以达到将前3个字节置为0的目的。

转载地址:https://blog.csdn.net/weixin_33001305/article/details/114524072 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java list keystore_Java / Keystore验证签名证书
下一篇:java编码解析解析_java如何解析如下的字符串编码?

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月30日 12时07分15秒