2021年5月12日星期三

关于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 的理解









原文转载:http://www.shaoqun.com/a/740774.html

跨境电商:https://www.ikjzd.com/

蜜芽:https://www.ikjzd.com/w/1320

数魔跨境:https://www.ikjzd.com/w/1425.html


前置知识点byte的范围[-128~127]内存里表现为0x00~0xFF刚好是一个8bits的字节问题byte[]hexData=newbyte[]{0x01,0x03,0x04,0x02,0x1F,0x01,0x4E,0x4B,(byte)0xE9};Java先把括号里的识别为int数,然后再自动转换为byte这里的int数0xE9,超出了byte的范围[-128~127],所以不会自动转换,
new old stock:https://www.ikjzd.com/w/2341
xinong:https://www.ikjzd.com/w/1368
promotion:https://www.ikjzd.com/w/127
Vcan:https://www.ikjzd.com/w/411
都在做跨境电商亚马逊无货源 但你真的知道优势在哪里吗?:https://www.ikjzd.com/home/17986
口述晚上我去妹妹房间里看见老公老公盯着我妹妹胸看还摸:http://lady.shaoqun.com/a/273932.html

没有评论:

发表评论