java byte数组转int数组_Java任意长度byte数组转换为int数组的方法
前言
嗯。最近工程上遇到一个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数组的方法相关推荐
- java byte转成int数组_Java任意长度byte数组转换为int数组的方法
前言 嗯.最近工程上遇到一个byte数组转换为int的问题,解决过程中遇到了几个坑,经过各种查资料终于还是解决了.撒花. Java的位运算以及byte数组与其他类型数据的转换比c/c++感觉麻烦一些. ...
- Java实现float转换成int代码_Java中如何将float转换为long或int?(附代码)
本篇文章给大家带来的内容是关于Java中如何将float转换为long或int?(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在Java中,有三种方法可以将float转换 ...
- byte数组转blob类型_Java类型相互转换byte[]类型,blob类型
在我们的程序开发当中,经常会用到java.sql.Blob.byte[].InputStream之间的相互转换,但在JDK的API当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们 ...
- java二维数组模拟用户登录_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)...
这里分享三道编程题, 下面是我个人的视频讲解我的解题思路以及代码运行演示https://www.zhihu.com/video/1253424180936724480 1. 编程实现以下需求: 定义一 ...
- java怎么设置多个输入_Java中从键盘输入多个整数的方法
Java中从键盘输入多个整数的方法 发布于 2020-4-2| 复制链接 分享一篇关于Java中从键盘输入多个整数的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小妖过来看看吧 例题:求数列的 ...
- java最多保留两位小数_java使double保留两位小数的多方法 java保留两位小数
这篇文章主要介绍了java使double类型保留两位小数的方法,大家参考使用吧mport java.text.DecimalFormat; DecimalFormat df = new De ...
- double operator[](int i)_java中double类型精度丢失问题及解决方法
原文链接:https://blog.csdn.net/yacolspace/article/details/78287394 double类型数据加减操作精度丢失问题 今天在项目中用到double类型 ...
- java 根据类名示例化类_Java LocalDateTime类| 带示例的getNano()方法
java 根据类名示例化类 LocalDateTime类getNano()方法 (LocalDateTime Class getNano() method) getNano() method is a ...
- java 1到n的质数_JAVA求1到n的质数和的方法
package org.hydrakyoufeng.test; /** * JAVA求1到n的质数和的方法 * @author HydraKyouFeng * */ public class Prim ...
最新文章
- Windows文件系统过滤驱动开发教程(0,1,2)
- 树莓派(raspberry)启用root账户
- 深入redis内部--内存管理
- 打孔怎么定位_红米K40将要发布,采用居中打孔屏,极窄边框设计
- Console.WriteLine()与MessageBox.Show()的区别
- Hibernate 之单向多对一映射及其衍生问题
- 中国互联网的抑郁:抄与被抄都很痛
- [Java基础]注解概念
- postgis创建空间数据库(pgadmin4)
- C# Http请求接口数据的两种方式Get and Post
- 【Python】Python海龟绘图秀场
- 前几天和前58技术委员会主席聊了聊技术梦想
- springboot web项目_SpringBoot 源码解析 (一):SpringBoot核心原理入门
- 【滤波跟踪】捷联惯导纯惯导解算matlab实现
- 汉字按笔画书写 生成动画 ,svg (使用Hanzi Writer)
- python金融衍生品大数据分析豆瓣_Python金融衍生品大数据分析
- 墨画子卿第三章第4节:躺着修行
- GEE引擎自定义进度条和自定义属性的脚本展示
- 弧齿锥齿轮零件图_弧齿锥齿轮加工原理
- 大学生个人网页模板 简单网页制作作业成品 极简风格个人介绍HTML(个人博客 4页)
热门文章
- Scrapy框架中解决OSError=[Errno 2] No such file or directory: 'Xvfb': 'Xvfb'
- 面试题——js垃圾回收机制和引起内存泄漏的操作
- [转] 基本RS触发器
- java8 metaspacesize_JVM --- MetaspaceSize理解
- xpath常用的定位方法
- VS解决方案、命名空间和项目的关系
- (PTA)7-3 选民投票 编程统计候选人的得票数。有若干位候选人(n<=10),候选人姓名从键盘输入(候选人姓名不区分大小写,姓名最长为9个字节),若干位选民,选民每次输入一个得票的候选人的名字
- python 游戏引擎 cocos2d_【Cocos2dx游戏开发】Cocos2d-x简介
- 深入解析actor 模型(一): actor 介绍及在游戏行业应用
- annotate 和 aggregate