java byte 变长_Java任意长度byte数组怎么转换为int数组

Java任意长度byte数组怎么转换为int数组

发布时间:2020-07-27 14:00:33

来源:亿速云

阅读:87

作者:小猪

这篇文章主要讲解了Java任意长度byte数组怎么转换为int数组,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

前言

嗯。最近工程上遇到一个byte数组转换为int的问题,解决过程中遇到了几个坑,经过各种查资料终于还是解决了。撒花。

Java的位运算以及byte数组与其他类型数据的转换比c/c++感觉麻烦一些。这里简单说明一下byte数组和int的转换吧。

总所周知,int类型数据在Java中占据32 bit,byte占据8 bit,这样的话,正常情况下4个byte可以转换成一个int类型数据。

当然,不正常情况下,3个byte或者2个byte甚至1个byte都可以转换为int数据,只需要高位补上就行。

嗯,坑来了。由于Java中int类型是有符号的,最高位为符号位,为0的话表示正数,为1的话表示负数。

以四位byte数组为例,要拼接成一个32 bit的int数据的话,只需要将四个byte按顺序连接起来就行,这样的话,就需要对四个byte进行移位操作。

第一位左移24位,第二位左移16位,第三位左移8位,第四位不动。。然后进行或运算。。

嗯,看起来好像完美。。。然而之前说过Java是有符号的,对于后三个byte,如果是负数的话,则高位都是1,这样高位的或运算将失效,前面的byte数据也就没有意义。

因此,对于后三个byte数据,进行移位操作前需要和0XFF进行与运算,消除高24位。

代码如下

public int bytesToInt(byte[] bytes){

return bytes[0]<<24|(bytes[1]&0xff)<<16|(bytes[2]&0xff)<<8|(bytes[3]&0xff);

}

对于不正常的情况,比如3个byte转换为int,则第一个左移16位,第二位与0xff后左移8位,第三位与0xff,然后进行或运算即可。

同理可运用于2个byte。

对于1个byte,直接强制转换为int即可。

嗯。。大概就是这样,第一位移位,之后的分别和0xff相与后再移位,最后进行或运算即可。

后来,闲着无聊,如果一个byte数组超过4位后,怎么办?当然返回一个int数组就行啦,反正4位byte转换成1个int,看着办就行。

public int[] bytesToInts(byte[] bytes){

int bytesLength=bytes.length;

int[] ints=new int[bytesLength%4==0? bytesLength/4:bytesLength/4+1];

int lengthFlag=4;

while (lengthFlag<=bytesLength){

ints[lengthFlag/4-1]=(bytes[lengthFlag-4]<<24)|(bytes[lengthFlag-3]&0xff)<<16|

(bytes[lengthFlag-2]&0xff)<<8|(bytes[lengthFlag-1]&0xff);

lengthFlag+=4;

}

for (int i=0;i

if (i==0) ints[lengthFlag/4-1]|=bytes[lengthFlag-4+i]<<8*(bytesLength+4-lengthFlag-i-1);

else ints[lengthFlag/4-1]|=(bytes[lengthFlag-4+i]&0xff)<<8*(bytesLength+4-lengthFlag-i-1);

}

return ints;

}

看完上述内容,是不是对Java任意长度byte数组怎么转换为int数组有进一步的了解,如果还想学习更多内容,欢迎关注亿速云行业资讯频道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值