2 字节到短 java

2022-09-01 07:04:49

我正在从串行端口读取133长度的数据包,最后2个字节包含CRC值,2个字节值我使用java制作了单个(我认为很短)。这是我所做的,

short high=(-48 & 0x00ff);
short low=80;

short c=(short) ((high<<8)+low);

但是我没有得到正确的结果,这是问题,因为有符号值?我怎么能解决这个问题,请帮我,我有麻烦了


答案 1

请记住,如果您不太熟悉细节,则不必通过位移位来打结。您可以使用字节缓冲器来帮助您:

ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(firstByte);
bb.put(secondByte);
short shortVal = bb.getShort(0);

反之亦然,你可以放一个短的,然后拉出字节。

顺便说一句,按位操作会自动将操作数提升到至少整数的宽度。实际上没有“不允许移动超过7位的字节”的概念,以及其他似乎正在流传的谣言。


答案 2

在 Java 中将流中的字节值转换为数值时,必须非常小心符号扩展。有一个带有负数的陷阱(来自(无符号)128-255的值)。

试试这个(如果hi和lo是任何Java整数类型,它有效):

short val=(short)(((hi & 0xFF) << 8) | (lo & 0xFF));

我发现在这些情况下最好用括号明确。