前言

嗯。最近工程上遇到一个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的bit提取。。

总结

到此这篇关于Java任意长度byte数组转换为int数组的文章就介绍到这了,更多相关Java byte数组转换为int数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

java byte转成int数组_Java任意长度byte数组转换为int数组的方法相关推荐

  1. java byte数组转int数组_Java任意长度byte数组转换为int数组的方法

    前言 嗯.最近工程上遇到一个byte数组转换为int的问题,解决过程中遇到了几个坑,经过各种查资料终于还是解决了.撒花. Java的位运算以及byte数组与其他类型数据的转换比c/c++感觉麻烦一些. ...

  2. Java实现float转换成int代码_Java中如何将float转换为long或int?(附代码)

    本篇文章给大家带来的内容是关于Java中如何将float转换为long或int?(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在Java中,有三种方法可以将float转换 ...

  3. java 创建多维数组_java中如何创建一个多维数组?实例展示

    在互联网产业发展的越发如火如荼的今时今日,越来越多的人开始投入到新兴技术的学习当中去.java作为一门十分重要的编程语言,是许多人首选的学习对象.今天就来为大家介绍一下java中如何创建一个多维数组, ...

  4. dotnet C# 将 Byte 二进制数组使用不安全代码快速转换为 int 或结构体数组

    我在写一个有趣的 WPF 应用,我会不断收到从硬件发过来的数据,这些数据被使用 Byte[] 数组进行传输.我想要使用最快的方法转换为我的 int 数组或者转换为结构体数组,此时可以使用不安全代码的方 ...

  5. java控件数组_java通过复选框控件数组实现添加多个复选框控件示例分享

    思路如下: 创建JPanel面板对象: 使用JPanel类的setLayout(0,4)方法设置网格布局管理器,即列数为4,行数自动调节: 创建一个字符串型一维数组作为控件文本数组: 创建一个JChe ...

  6. java控件数组_java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节.方法如下: 创建JPanel面板对象: 使用JPanel ...

  7. java checkbox数组_Java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节. 思路如下: 创建JPanel面板对象: 使用JPane ...

  8. 用java怎么输入字符数组_Java程序填充用户输入的字符数组

    对于用户输入,将Scanner类与System.in一起使用.获取输入后,将其转换为字符数组-char[] a = s.next().toCharArray(); 现在,显示它直到字符数组的长度,即用 ...

  9. java基础 多维数组_java基础:3.2 多维数组

    1.申明 int [][] array1 ={  {1,2,3} , {0} , {2,2,2,2,2} , {5,6} };  锯齿数组 int [][] array2 = new int [5][ ...

最新文章

  1. 2021 IEEE热门AI话题盘点:模仿生物大脑打造神经网络、GPT3“不当言论”惹关注…...
  2. linux su、su -和sudo的区别
  3. Linux插件shellinabox结合翻译插件使用(以Chrome为例)
  4. 碎碎念-----快排与工作
  5. Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类
  6. 带超时的system
  7. 视觉slam重点知识笔记
  8. 通过Java 8流使用Oracle AQ
  9. THINKPHP3.2视频教程
  10. python 生成器装饰器_python: 生成器,装饰器以及列表推导式写法
  11. 一代神机落幕!苹果把iPhone 6 Plus列为过时产品,网友吵翻了...
  12. 【Filebeat】logstash 和filebeat 是什么关系
  13. android selector 中的选中、点击、获得焦点的区别
  14. 初识iptables规则
  15. 泛微oa 明细数据合计
  16. Windows中 配置DHCP服务器
  17. Linux系统学习方法论 1
  18. 为什么挤破头进大厂,大厂如何设置薪资职级体系?
  19. verilog always语法_Verilog 最全经验总结(建议收藏)
  20. c语言路径搜索,c语言程序(单元路劲及多元路径的搜索)

热门文章

  1. 百度云管家提速试用手记 - 几多欢喜几多愁
  2. 编写HTML的一些小技巧(针对IE)
  3. 数字电子技术实验作业(10)
  4. 修复克米3.5勋章中心空白不显示问题
  5. Odoo 16 企业版手册 - 库存管理之库位管理
  6. 为什么量子力学和相对论有矛盾?超弦理论或将统一物理学
  7. 超清动态桌面壁纸大全
  8. java程序员面试常见面试题及答案整理
  9. 微信小程序实战须知2:详解数据API所需网络配置域名、Https、备案、SSL
  10. centos7中安装pip