前言
嗯。最近工程上遇到一个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。
嗯。。大概就是这样,第一位移位,之后的分别和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数组内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!
原文链接:https://blog.csdn.net/zhuimengfb/article/details/49004711
相关文章
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-27 39
-
2025-05-25 78
-
Dotnet Core 技术之Dotnet 6.0 深度探索
2025-05-29 79 -
2025-05-25 86
-
2025-05-27 74

