关于Java处理串口二进制数据的问题 byte的范围 一个字节8bits
2021-05-29 19:10
标签:-128 http png com 识别 知识 mamicode 调试器 href byte的范围[-128~127] 内存里表现为 0x00~0xFF Java先把括号里的识别为int数,然后再自动转换为byte 那么问题来了,内存里是这样的 用 byte是有符号的,为了方便硬件运算,因此正负转换用了补码 Java所有数默认都识别为int,0xE9 被识别为 所以正数的时候没错,但负数的时候就需要处理了 对于 byte[-128,127], 其[0,127]范围的数据和 int 中的 [0,127] 完全一致,不需要 & 0XFF, 只有对于 [-128,-1] 的 byte 数据才需要 & 0XFF. 详见:对 byte & 0xFF 的理解 关于Java处理串口二进制数据的问题 byte的范围 一个字节8bits 标签:-128 http png com 识别 知识 mamicode 调试器 href 原文地址:https://www.cnblogs.com/yucloud/p/Java_byte.html前置知识点
刚好是一个8bits的字节问题
byte[] hexData = new byte[] {0x01, 0x03, 0x04, 0x02, 0x1F, 0x01, 0x4E, 0x4B, (byte)0xE9 };
这里的int数0xE9,超出了byte的范围[-128~127],所以不会自动转换,必须代码指定强制转换。
调试器结果:
而且打印出来的 (hexData[8])
也是这样,所以不是调试器的问题,而是Java就是这么识别的。解决
(hexData[8]&0xFF)
即可取出低位揭秘
(int)233
超出了byte范围[-128~127]。
强制转换为byte后发生上溢,溢出了233-127=106,因此结果为 -1+(-128)+106=-23
-23的十六进制为 FFFFFFFFFFFFFFE9
,也就是调试器里的那个数值
下一篇:IDL语言简明教程
文章标题:关于Java处理串口二进制数据的问题 byte的范围 一个字节8bits
文章链接:http://soscw.com/index.php/essay/89241.html