前言
嗯。最近工程上遇到一个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位。
代码如下
1
2
3
|
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,看着办就行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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<bytesLength+ 4 -lengthFlag;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的bit提取。。
总结
到此这篇关于Java任意长度byte数组转换为int数组的文章就介绍到这了,更多相关Java byte数组转换为int数组内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/zhuimengfb/article/details/49004711