前置知识点

byte的范围[-128~127] 内存里表现为 0x00~0xFF

刚好是一个8bits的字节

问题

byte[] hexData = new byte[] {0x01, 0x03, 0x04, 0x02, 0x1F, 0x01, 0x4E, 0x4B, (byte)0xE9 };

Java先把括号里的识别为int数,然后再自动转换为byte

这里的int数0xE9,超出了byte的范围[-128~127],所以不会自动转换,必须代码指定强制转换。


那么问题来了,内存里是这样的

调试器结果:



而且打印出来的 (hexData[8]) 也是这样,所以不是调试器的问题,而是Java就是这么识别的。

解决

(hexData[8]&0xFF) 即可取出低位

揭秘

byte是有符号的,为了方便硬件运算,因此正负转换用了补码

Java所有数默认都识别为int,0xE9 被识别为 (int)233 超出了byte范围[-128~127]。

强制转换为byte后发生上溢,溢出了233-127=106,因此结果为 1+(-128)+106=-21

-21的十六进制为 FFFFFFFFFFFFFFE9,也就是调试器里的那个数值

所以正数的时候没错,但负数的时候就需要处理了

对于 byte[-128,127], 其[0,127]范围的数据和 int 中的 [0,127] 完全一致,不需要 & 0XFF, 只有对于 [-128,-1] 的 byte 数据才需要 & 0XFF.

详见:对 byte & 0xFF 的理解

关于Java处理串口二进制数据的问题 byte的范围 一个字节8bits的更多相关文章

  1. Java JDBC 操作二进制数据、日期时间

    二进制数据 mysql提供了四种类型来存储二进制数据: TinyBlob    最多可存储255字节 Blob   最多可存储65KB MediumBlob    最多可存储16MB LongBlob ...

  2. java面试题之数据基本类型各占几个字节

    类型 位数 字节数 short 2*8 2 char 2*8 2 int 4*8 4 float 4*8 4 long 8*8 8 double 8*8 8

  3. SQLite数据库如何存储和读取二进制数据

    SQLite数据库如何存储和读取二进制数据 1. 存储二进制数据 SQLite提供的绑定二进制参数接口函数为: int sqlite3_bind_blob(sqlite3_stmt*, int, co ...

  4. Node.js之使用Buffer类处理二进制数据

    Node.js之使用Buffer类处理二进制数据 Buffer类可以在处理TCP流或文件流时处理二进制数据,该类用来创建一个专门存放二进制数据的缓存区. 1. 创建Buffer对象 1.1 直接创建: ...

  5. 转载:【原译】Erlang构建和匹配二进制数据(Efficiency Guide)

    转自:http://www.cnblogs.com/futuredo/archive/2012/10/19/2727204.html Constructing and matching binarie ...

  6. JSBinding+Bridge:逻辑代码中操作二进制数据

    以这2个函数为例 class File { public static byte[] ReadAllBytes(string path); public static void WriteAllByt ...

  7. 关于STM32串口接收中断中只能接收一个字节

    最近调试STM32的串口接收时发现例程中只能接收一个字节 例程如下: //初始化串口1 void uart_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef G ...

  8. 如何用Java语言向串口读写数据

    原作者:赛迪网作者 shihuchen ,我在他的基础上进行了部分修改 [赛迪网讯]串口, RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA ...

  9. Java 二进制数据转成文件

    SqlServer数据库中,存储文件的字段的类型是image,对应的Java类型是byte[],下面的函数将演示如何把读取出来数据放入指定目录.当然,首先需要从数据库读出,然后调用该方法. impor ...

随机推荐

  1. css整理之-----------基本知识

    盒子模型 所有HTML元素可以看作盒子,它包括:边距,边框,填充,和实际内容. CSS中组成一个块级盒子需要: Content box: 这个区域是用来显示内容,大小可以通过设置 width 和 he ...

  2. Python中树的遍历-堆排序

    1.二叉树的遍历 遍历:迭代所有元素一遍. 树的遍历:对树中所有的元素不重复的访问一遍,也成扫描 广度优先遍历:层序遍历 深度优先遍历:前序.中序.后续遍历. 遍历序列:将树中所有元素遍历一遍后,得到 ...

  3. nginx提供网站首页的一个实例

    如果既想匹配'/'进行反向代理,同时又想通过nginx提供网站首页,可以在server中进行如下配置: user python; # 运行Nginx的用户 worker_processes auto; ...

  4. 力扣 - 347. 前 K 个高频元素

    目录 题目 思路1(哈希表与排序) 代码 复杂度分析 思路2(建堆) 代码 复杂度分析 题目 347. 前 K 个高频元素 思路1(哈希表与排序) 先用哈希表记录所有的值出现的次数 然后将按照出现的次 ...

  5. Win10环境下YOLO5 快速配置与测试

    目录 一.更换官方源 二.安装Pytorch+CUDA(python版本) 三.YOLO V5 配置与验证 四.数据集测试 五.小结 不想看前面,可以直接跳到标题: 一.更换官方源 在 YOLO V5 ...

  6. Python基础(八):字符串的使用(下)

    find() 功能:检测字符串是否包含指定字符.如果包含指定字符,则返回开始的索引:否则,返回-1. >>> st = "hello world" >> ...

  7. 几十行代码实现ASP.NET Core自动依赖注入

    在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...

  8. CMD控制台(命令提示符)的打开方式

    打开CMD的方式 打开+系统+命令提示符 Win键 +R 输入cmd 打开控制台(推荐使用) 在任意的文件夹下面,按住shift键+鼠标右键点击+在此处打开命令行窗口 资源管理器的地址栏前面加上cmd ...

  9. CLion 2020.1.2 激活

    1 下载 官网. 2 运行 解压安装并运行,选择Evaluate. 3 激活 来这里下载jar补丁,拖进去即可.

  10. Day05_26_Overide_方法重写

    Overide_方法重写 * 什么是方法重写(Overide)? - 方法重写也叫方法覆盖 ,重写是指子类对父类所允许访问的方法的实现过程进行重新编写, 返回值类型和形参都不能改变.即外壳不变,核心重 ...