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


猜你喜欢
- springboot项目出现”java: 错误: 无效的源发行版:17“问题解决方案下面是报错页面问
- 对于使用文件进行交换数据的应用来说,使用FTP 服务器是一个很不错的解决方案。关于FileZilla Server服务器的详细搭建配置过程,
- AspectJ 是通过注解来描述切点与增强的。1 开发环境要求因为要使用注解,所以请确保使用的 Java5.0 及以上版本。引入 Aspec
- 目录一、Gradle相比Maven的优势二、基本配置三、最佳实践四、总结一、Gradle相比Maven的优势配置简洁Maven是用pom.x
- java反射机制是什么反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法;反射机制能够做什么1、判断运行对象的所
- 随着互联网的飞跃式发展,移动支付已越来越受欢迎并且已成为常态,很多三方支付公司推出了很多支付方式如快捷支付、认证支付、扫码支付等等。快捷支付
- 目录重入锁1. 实现重进入2. 公平与非公平获取锁的区别读写锁1. 接口示例2. 读写状态的设计3. 写锁的获取与释放4. 读锁的获取与释放
- 前不久看到鸿洋大大的圆形菜单,就想开始模仿,因为实在是太酷了,然后自己根据别人(zw哥)给我讲的一些思路、一些分析,就开始改造自己的圆形菜单
- 方法重载概述方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法互相构成重载* 多个方法在同一个类中* 多个放方法具有相同方
- package com.infomorrow.parser_report;import org.junit.Test;public clas
- 本文实例为大家分享了Android实现简易QQ界面的具体代码,供大家参考,具体内容如下要求: (1)与QQ界面控件数目、样式相同 (2)与Q
- 本文实例讲述了Java实现批量向mysql写入数据的方法。分享给大家供大家参考,具体如下:private static String use
- 本文实例展示了WinForm实现为TextBox设置水印文字功能,非常实用的技巧,分享给大家供大家参考。关键代码如下:using Syste
- 简介Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法
- 最近微框架spring-boot很火,笔者也跟风学习了一下,废话不多说,现给出一个读取配置文件的例子。首先,需要在pom文件中依赖以下jar
- 1. Stack1.1 介绍Stack 栈是 Vector 的一个子类,它实现了一个标准的后进先出的栈。它的底层是一个数组。堆栈只定义了默认
- 一、摘要总结基于C#的UDP协议的同步通信。 二、实验平台Visual Studio 2010 三、实验原理UDP传输协
- 学习内容Java I/O 项目案例内容管理java文件I/O实例----生成报表我们之前学习了两个重要的模块,一个就是Java I/O 另外
- package com.chase.test;import java.util.ArrayList;import java.util.Has
- Java调用天气Webservice的小应用废话不多说,直接贴代码: CityReq.javapackage com.weathe