去年笔者和一个硬件厂商调试打印机的时候遇到这个一个问题,厂商需要打印报文中传输报文的长度标志,按大端序,将长度的高位和低位放到两个字节里,笔者由于基础知识不牢固,在这个问题上浪费了较长时间,今年开始写博客了,就记录一下这个问题。笔者使用了int来记录长度,其实应该用两个字节的short来记录,这样更简单。

大小端序

要想拿int的高低位字节,首先要理解大小端序。这里以int举例,int有四个字节A,B,C,D。那么内存里存储int类型占用了四个字节的位置,这四个字节在内存中肯定占用了连续递增的四个地址,大小端序指得就是这四个字节在这四个地址中是顺序排列的还是逆序排列的。如果是顺序排列的,那么我们叫大端序,如果是逆序排列的,就叫小端序。

再拿网络传输这个int值来举例,甲向乙传输数据,乙拿到甲传的字节数组以后要知道怎么拼接这四个字节,如果甲是按顺序传输这四个字节,而乙按逆序拼接四个字节,那么双方得到的int值肯定是不一样的。那么怎么解决这个问题呢?方法就是双方协定一个顺序,比如按大端序传输,甲将四个字节按大端序传输给乙,乙再按大端序拼接字节,这样双方得到的int值就是一样的了。

总结一下就是,大端序,高位字节在前,低位字节在后。小端序,高位字节在后,低位字节在前。一般交互都是默认大端序。

获取int的高低位字节数组

这里给出了大小端序的int和字节数组互转函数

/*** 小端序 字节数组转int** @param bytes* @return*/public static int littleEndian(byte[] bytes) {return (bytes[0]&0XFF)| ((bytes[1]&0XFF) << 8)| ((bytes[2]&0XFF) << 16)| ((bytes[3]&0XFF) << 24);}/*** 大端序 字节数组转int** @param bytes* @return*/public static int bigEndian(byte[] bytes) {//System.out.println(String.format("%32s", Integer.toBinaryString(bytes[3]&0XFF)).replaceAll("\\s", "0"));//System.out.println(String.format("%32s", Integer.toBinaryString(((bytes[2]&0XFF) << 8)).replaceAll("\\s", "0")));//System.out.println(String.format("%32s", Integer.toBinaryString(((bytes[1]&0XFF) << 16)).replaceAll("\\s", "0")));//System.out.println(String.format("%32s", Integer.toBinaryString(((bytes[0]&0XFF) << 24)).replaceAll("\\s", "0")));return (bytes[3]&0XFF)| ((bytes[2]&0XFF) << 8)| ((bytes[1]&0XFF) << 16)| ((bytes[0]&0XFF) << 24);}/*** 大端序 int转字节数组** @param i* @return*/public static byte[] bigEndian(int i) {int byte1 = i & 0XFF;int byte2 = (i & 0XFFFF) >>> 8;int byte3 = (i & 0XFFFFFF) >>> 16;int byte4 = (i & 0XFFFFFFFF) >>> 24;return new byte[]{(byte) byte4, (byte) byte3, (byte) byte2, (byte) byte1};}/*** 小端序 int转字节数组** @param i* @return*/public static byte[] littleEndian(int i) {int byte1 = i & 0XFF;int byte2 = (i & 0XFF << 8) >> 8;int byte3 = (i & 0XFF << 16) >> 16;int byte4 = (i & 0XFF << 24) >> 24;return new byte[]{(byte) byte1, (byte) byte2, (byte) byte3, (byte) byte4};}public static void main(String[] args) {int a = new Random().nextInt();String s = String.format("%32s", Integer.toBinaryString(a)).replaceAll("\\s", "0");System.out.println("原数据:             " + s.substring(0, 8) + " " + s.substring(8, 16) + " " + s.substring(16, 24) + " " + s.substring(24, 32) + " ");byte[] bytes = bigEndian(a);System.out.printf("大端序-int转字节数组:");for (int i = 0; i < bytes.length; i++) {System.out.print(String.format("%8s", Integer.toBinaryString(bytes[i] & 0XFF)).replaceAll("\\s", "0") + " ");}System.out.println();System.out.println("大端序-字节数组转int验证:" + (bigEndian(bytes) == a));byte[] bytes2 = littleEndian(a);System.out.printf("小端序-int转字节数组:");for (int i = 0; i < bytes2.length; i++) {System.out.print(String.format("%8s", Integer.toBinaryString(bytes2[i] & 0XFF)).replaceAll("\\s", "0") + " ");}System.out.println();System.out.println("小端序-字节数组转int验证:" + (littleEndian(bytes2) == a));}
}原数据:             10010100 11111001 01101110 00100011
大端序-int转字节数组:10010100 11111001 01101110 00100011
大端序-字节数组转int验证:true
小端序-int转字节数组:00100011 01101110 11111001 10010100
小端序-字节数组转int验证:true

JAVA int类型 获取高低位相关推荐

  1. java int类型与long类型

    问题引出   假设定义两个int类型的值     int a=1646757875;     int b=1646757875;     System.out.print(a+b);   控制台打印 ...

  2. Java int类型的除法 向上取整 向下取整 保留小数位数

    今天做了一道计算题,用到整数相除的向上取整,突然卡住了.然后查询并试用了如下方法. 一.三目运算法(向上 / 向下取整 快捷.准确) 两个int型 a.b,a / b 向上取整.可以使用 a / b ...

  3. java int类型 BigDecimal类型转成汉字金额大写

    import java.math.BigDecimal;public class CurrencyUtil {public CurrencyUtil() {}public static String ...

  4. java int类型能表示的数值范围

    int 4字节(byte) 1字节(byte) = 8比特(bit) 抛开数值,单纯从计算机角度考虑,8bit能表示 2^8=256种状态 计算机中,数字以补码形式存储,最高位为符号位: 正数最高位为 ...

  5. java int 16进制字符串_关于将java int类型转换为16进制字符串的问题

    package p5.com.byd.mes.dev.tool.baseToChar; /** * 任意进制转换器 * @author solar */ public class Decimal { ...

  6. c 取short 的高低位_数据高低位

    int表示"基本整型". 类型说明符为int,在内存中占4个字节(有的是2个字节,不同的编译系统中有差异). 一个int类型数据是32位,也就是四个字节 ,而bit类型数据占1个字 ...

  7. java 正整数类型_Java 整数类型

    Java教程 - Java整数类型 Java字节类型 最小的整数类型为byte.byte类型变量在使用来自网络或文件的数据流时非常有用. 字节变量通过使用byte关键字声明.下面声明两个字节变量b和c ...

  8. 数据库decimal对应java什么类型_数据库字段类型和Java的对应关系

    1.CHAR.VARCHAR .LONGVARCHAR 可映射为 String 或 char[],但 String 更适合于一般用法 2.BINARY.VARBINARY 和 LONGVARBINAR ...

  9. Java高低位和byte转int

    最近研究I/O流,发现read()方法返回的是int类型,原来是将一个byte读入到一个int,有效的数据只占据int型变量的最低8位.在正常情况下这个int型的变量永远都不可能是负数. 什么是高低位 ...

最新文章

  1. 在String.Format [复制]中转义大括号'{'
  2. mtk android lcm调试
  3. 5年博龄只有十几篇文章,惭愧呀
  4. Goodbye 2017 B
  5. .net 出现的异常
  6. Redis:23---info命令总结
  7. 基于Blink构建亲听项目以及全链路debug项目实时响应能力
  8. VUE3模板ref引用子组件或者子组件的方法
  9. 利用python解析手机通讯录
  10. golang之strings
  11. 翻译:谁将在AI中赚钱?by Simon Greenman
  12. NETARM(NSMS)自定义万能表单系统使用说明
  13. 天猫搜索前端架构演进之路
  14. 如何判断是pc端还是移动端
  15. CentOS装docker
  16. 简支梁挠度计算公式推导_简支梁的最大挠度计算公式 l.ppt
  17. 给苹果电脑选机械键盘
  18. 百度地图开发-在百度地图上面显示出运动的轨迹
  19. 经济基础知识(中级)【2】
  20. 数据处理之数据类型转换

热门文章

  1. 智行者王肖:自动驾驶本质在于对待数据的态度、获取及应用方式 | 自动驾驶这十年... 1
  2. latex论文排版初级应用
  3. 微信客服消息跳转h5,回复关键字,跳转小程序方式全集
  4. Mysql日期的加减法_mysql日期加减
  5. java基于ssm的个人博客系统个人博客网站个人博客项目源码
  6. infoQ 百度技术沙龙第25期回顾:海量数据处理技术解析
  7. GAIL之imitation代码运行(含PBS)
  8. From Shadow Generation to Shadow Removal (CVPR2021)阅读笔记
  9. GBase 8a的产品简介
  10. 百度地图集成(一):百度地图简单实现