[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中无符号类型的解决方案

相关文章
|
4月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
1519 1
|
6月前
|
存储 缓存 人工智能
Java int和Integer的区别
本文介绍了Java中int与Integer的区别及==与equals的比较机制。Integer是int的包装类,支持null值。使用==比较时,int直接比较数值,而Integer比较对象地址;在-128至127范围内的Integer值可缓存,超出该范围或使用new创建时则返回不同对象。equals方法则始终比较实际数值。
229 0
|
3月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
595 4
|
4月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
1625 8
|
9月前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
1394 4
|
8月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
320 0
|
7月前
|
Java 数据安全/隐私保护 计算机视觉
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本内容提供Java生成自定义图片的示例代码,涵盖基础图像创建、文本添加及保存功能,适合学习2D图形编程。包括教学示例图片生成、文本图层处理和数字水印技术实现方案。
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
269 9
|
7月前
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
5551 1
|
7月前
|
Java 数据安全/隐私保护
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本项目提供了一套基于Java的图片处理教学方案,包含自定义图片生成、图像水印添加及合法电子凭证生成技术示例。