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

Posted 蓝天上的云℡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java处理串口二进制数据的问题 byte的范围 一个字节8bits相关的知识,希望对你有一定的参考价值。

前置知识点

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],所以不会自动转换,必须代码指定强制转换。



那么问题来了,内存里是这样的
调试器结果:
image
而且打印出来的 (hexData[8]) 也是这样,所以不是调试器的问题,而是Java就是这么识别的。

解决

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

揭秘

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

Java所有数默认都识别为int,0xE9 被识别为 (int)233 超出了byte范围[-128~127]。
强制转换为byte后发生上溢,溢出了233-127=106,因此结果为 -1+(-128)+106=-23
-23的十六进制为 FFFFFFFFFFFFFFE9,也就是调试器里的那个数值

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

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

详见:对 byte & 0xFF 的理解

以上是关于关于Java处理串口二进制数据的问题 byte的范围 一个字节8bits的主要内容,如果未能解决你的问题,请参考以下文章

java串口通信中怎样以十六进制数发送

JAVA串口怎么发送16进制?

详解java中的byte类型

最全面的Java字节byte操作,处理Java基本数据的转换及进制转换操作工具,流媒体及java底层开发项目常用工具类

Java语言中关于数据类型的一些总结

java中如何声明一个十六进制的字符串,或者说,怎么发送一个十六进制数据?