我正在读取来自serialport的133长度数据包,最后2个字节包含CRC值,2个字节值我使用java制作单个(我认为是短)。 这就是我所做的,
short high=(-48 & 0x00ff);
short low=80;
short c=(short) ((high<<8)+low);
但是我没有得到正确的结果,是因为签名有问题吗? 我怎么能解决这个问题,请帮我解决这个问题
答案 0 :(得分:58)
请记住,如果您对细节不太熟悉,则不必将自己束缚在变速之中。您可以使用ByteBuffer来帮助您:
ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(firstByte);
bb.put(secondByte);
short shortVal = bb.getShort(0);
反之亦然,你可以缩短,然后拉出字节。
顺便说一下,按位运算会自动将操作数提升到至少int的宽度。实际上并没有“不允许超过7位的字节转换”这一概念以及其他传言似乎已经过去了。
答案 1 :(得分:26)
在Java中将字节值从流转换为数值时,您必须非常小心使用符号扩展。有一个带负数的陷阱(值来自(无符号)128-255)。
试试这个(如果hi和lo是任何Java整数类型,它都有效):
short val=(short)(((hi & 0xFF) << 8) | (lo & 0xFF));
我发现在这些情况下最好明确括号。
答案 2 :(得分:9)
其他答案还可以,但我想强调一下这个类型:
short high=(-48 & 0x00ff);
short low=80;
int c= ((high & 0xFF) << 8) | (low & 0xFF);
short
类型可以表示介于-32768到32767之间的值。53328不能很好地存储,请使用int
,因为它允许存储无符号值~10 9
因此,不要将表达式向下转换为short,因为它会使符号值符合你的意思。
答案 3 :(得分:6)
当尝试连接字节(非常微妙)
时会发生这种情况byte b1 = (byte) 0xAD;
byte b2 = (byte) 0xCA;
short s = (short) (b1<<8 | b2);
以上产生0xFFCA,这是错误的。 这是因为b2是负数(字节类型是有符号的!),这意味着当它将按位转换为int类型时操作,它将被填充为0xF!
因此,您必须记住屏蔽填充的字节,以便它们肯定为零:
short s = (short) (b1<<8 | b2 & 0xFF);
答案 4 :(得分:2)
您可以以更易读,更优雅的方式将2个字节转换为短片。
OnMessageReceived
第一个字节是最重要的字节。
答案 5 :(得分:0)
这对我有用
{{1}}