[Java工具] 关于byte和int的转换

简介: 需求单片机通过Socket发送过来类似 { 0xff,0x0c ,0x80...}的byte数组,根据协议分为unsigned char 和signed char两种类型。
需求

单片机通过Socket发送过来类似 { 0xff,0x0c ,0x80...}的byte数组,根据协议分为unsigned char 和signed char两种类型。需要将int数据转为两个byte发送给单片机,或将单片机发来的2个byte转化为int。

工具程序
/**
     * 将两个byte数据转化为有符号int
     * @param high : 高八位
     * @param low : 低八位
     * @return
     */
    public static int twoByteToSignedInt(byte high,byte low){
        return (high << 8) | low;
    }

    /**
     * 将两个byte数据转化为无符号int
     * @param high : 高八位
     * @param low : 低八位
     * @return
     */
    public static int twoByteToUnsignedInt(byte high,byte low){
        return ((high << 8) & 0xffff) | (low & 0x00ff);
    }
    /**
     * 将int转换为两个byte
     * @param numInt : 实际只取其中的低16位二进制数
     * @return 长度为2的byte数组 ,byte[0]为高8位,byte[1]为低八位
     */
    public static byte[] intToTwoByte(int numInt){
        byte[] rest = new byte[2];
        if(numInt < -32768 || numInt > 32767){
            return null;
        }
        rest[0] = (byte)(numInt >> 8);//高8位
        rest[1] = (byte)(numInt & 0x00ff);//低8位

        return rest;
    }
解释
  • 单片机发送过来的数据有 unsigned char 和 signed char 之分;而 Java 中的 byte(8位)、int(32位) 都是有符号的。
  • 计算机里的数字,不管正负,其底层都是以补码形式存在的!!
  • Java 的二进制采用补码形式。比如 Java 里的 Integer.toBinaryString(int) 函数,如果传入负数,则只会输出其补码形式,传入正数则输出原码二进制数(正数补码=原码)。
  1. signed char 转为 Java 的有符号 int
    参见函数 twoByteToSignedInt(byte high,byte low) 。由于在单片机中signed char也是以补码形式存在,所以直接用位操作将两个byte拼接为一个int即可。

  2. unsigned char 转为 Java 的无符号 int
    参见函数 twoByteToUnsignedInt(byte high,byte low) 。那为什么要按位与0xffff呢?因为byte->int会发生符号扩展,这在转为有符号int时没有影响,但在转为无符号int时,符号扩展会造成数值出现误差。
    具体来说,比如对于一个byte,如果不进行& 0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行f符号扩展,例如补码11111111的十进制数为-1,转换为int时变为1111 1111 1111 1111 1111 1111 1111 1111(补码)即0xffffffff但是这个数是不对的,这种补位就会造成误差。和0xff相与后,高24比特就会被清0了,结果就对了。

  3. int 转为 unsigned/signed char
    参见intToTwoByte(int numInt)
    直接取int里的低16位即可。因为无论正负,在单片机里都是以补码形式存在,不需要额外转换。

参考

Java中的Byte转为无符号的Integer
Java中字节与无符号数之间的转换
java中无符号类型的解决方案

相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
69 9
|
2月前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
38 1
|
25天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
137 83
|
22天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
40 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
25天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
53 26
|
26天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
48 24
|
1月前
|
Java
byte加byte居然是int了
为什么在Java中,byte加byte的结果不是byte,而是int?本文将带你从Java语言规范和JVM规范层面研究该问题。
53 3
byte加byte居然是int了
|
25天前
|
数据采集 存储 监控
Java爬虫:数据采集的强大工具
在数据驱动的时代,Java爬虫技术凭借其强大的功能和灵活性,成为企业获取市场信息、用户行为及竞争情报的关键工具。本文详细介绍了Java爬虫的工作原理、应用场景、构建方法及其重要性,强调了在合法合规的前提下,如何有效利用Java爬虫技术为企业决策提供支持。
|
1月前
|
存储 算法 Java
Java零基础-charAt(int index)详解
【10月更文挑战第20天】Java零基础教学篇,手把手实践教学!
57 4
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
45 5