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

作者:zhuimengfb 时间:2023-02-15 15:26:32 

前言

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

来源:https://blog.csdn.net/zhuimengfb/article/details/49004711

标签:int,byte,java
0
投稿

猜你喜欢

  • java实现微信扫码登录第三方网站功能(原理和代码)

    2023-08-04 00:44:11
  • Idea自动生成Entity实现过程详解

    2022-06-03 12:18:24
  • Java基于外观模式实现美食天下食谱功能实例详解

    2022-08-22 22:59:51
  • flutter实现扫码枪获取数据源禁止系统键盘弹窗示例详解

    2023-07-23 01:52:41
  • 解决mybatis一对多查询resultMap只返回了一条记录问题

    2022-07-08 08:36:31
  • Mybatis如何使用ognl表达式实现动态sql

    2021-06-22 03:34:49
  • Spring 自动装配的二义性实例解析

    2021-12-16 00:37:55
  • Java开发之Lombok指南

    2022-11-19 21:49:28
  • 详解C#获取特定进程CPU和内存使用率

    2022-06-23 03:06:42
  • 深入第K大数问题以及算法概要的详解

    2022-05-22 16:52:29
  • 关于Mybatis-Plus Update更新策略问题

    2022-04-14 19:29:24
  • Android Walker登录记住密码页面功能实现

    2023-12-16 05:45:03
  • Java编程中的条件判断之if语句的用法详解

    2022-11-27 14:14:36
  • JDBC连接MySQL并实现模糊查询

    2021-07-06 01:42:28
  • MAC算法之消息摘要算法HmacMD5的实现

    2023-02-13 08:03:28
  • C#中Task.Yield的用途深入讲解

    2022-11-12 00:16:23
  • 初步编写IDEA\\AndroidStudio翻译插件的方法

    2022-12-14 19:30:30
  • Java并发编程之线程中断

    2022-04-28 02:02:44
  • 详解App保活实现原理

    2022-01-20 17:59:10
  • 分享15款Java程序员必备的开发工具

    2021-12-07 19:09:07
  • asp之家 软件编程 m.aspxhome.com