Java任意长度byte数组转换为int数组的方法

 更新时间:2020年07月26日 15:27:22   作者:zhuimengfb  
这篇文章主要给大家介绍了关于Java任意长度byte数组转换为int数组的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

嗯。最近工程上遇到一个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<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数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot+Shiro+Jwt实现权限控制的项目实践

    Springboot+Shiro+Jwt实现权限控制的项目实践

    如今的互联网已经成为前后端分离的时代,所以本文在使用SpringBoot整合Shiro框架的时候会联合JWT一起搭配使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Jmeter安装的方法步骤详解

    Jmeter安装的方法步骤详解

    这篇文章主要介绍了Jmeter安装的方法步骤详解,Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域,需要的朋友可以参考下
    2019-07-07
  • Java的动态分派和静态分派的实现

    Java的动态分派和静态分派的实现

    这篇文章主要介绍了Java的动态分派和静态分派的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Java使用Deque实现堆栈的方法

    Java使用Deque实现堆栈的方法

    这篇文章主要介绍了Java使用Deque实现堆栈的方法,实例分析了java简单实现堆栈的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 关于HttpClient 引发的线程太多导致FullGc的问题

    关于HttpClient 引发的线程太多导致FullGc的问题

    这篇文章主要介绍了关于HttpClient 引发的线程太多导致FullGc的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 详解利用SpringCloud搭建一个最简单的微服务框架

    详解利用SpringCloud搭建一个最简单的微服务框架

    这篇文章主要介绍了详解利用SpringCloud搭建一个最简单的微服务框架,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 使用mybatis-plus-generator进行代码自动生成的方法

    使用mybatis-plus-generator进行代码自动生成的方法

    这篇文章主要介绍了使用mybatis-plus-generator进行代码自动生成的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • java 自动生成略缩图示例代码

    java 自动生成略缩图示例代码

    本篇文章,在前辈的经验基础上,分别对单图生成略缩图和批量生成略缩图做个小结
    2013-07-07
  • MybatisPlus将自定义的sql列表查询返回改为分页查询

    MybatisPlus将自定义的sql列表查询返回改为分页查询

    本文主要介绍了MybatisPlus将自定义的sql列表查询返回改为分页查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • Java BoxLayout(盒子布局)布局管理器解析

    Java BoxLayout(盒子布局)布局管理器解析

    这篇文章主要介绍了Java BoxLayout(盒子布局)布局管理器解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论