2个字节来缩短java
我正在读取来自serialport的133长度数据包,最后2个字节包含CRC值,2个字节值我使用java制作单个(我想)。 这就是我所做的,
short high=(-48 & 0x00ff); short low=80; short c=(short) ((high<<8)+low);
但是我没有得到正确的结果,是因为签名有问题吗? 我怎么能解决这个问题,请帮我解决这个问题
请记住,如果您对细节不太熟悉,则不必将自己束缚在比特移位中。 您可以使用ByteBuffer来帮助您:
ByteBuffer bb = ByteBuffer.allocate(2); bb.order(ByteOrder.LITTLE_ENDIAN); bb.put(firstByte); bb.put(secondByte); short shortVal = bb.getShort(0);
反之亦然,你可以放一个短,然后拉出字节。
顺便说一下,按位运算自动将操作数提升到至少int的宽度。 实际上并没有“不允许超过7位转换字节”这一概念以及其他似乎正在迂回曲折的谣言。
将流中的字节值转换为Java中的数值时,必须非常小心使用符号扩展。 有一个带负数的陷阱(值来自(无符号)128-255)。
试试这个(如果hi和lo是任何Java整数类型,它都有效):
short val=(short)(((hi & 0xFF) << 8) | (lo & 0xFF));
在这些情况下,我发现最好明确括号。
其他答案还可以,但我想强调一下这种类型:
short high=(-48 & 0x00ff); short low=80; int c= ((high & 0xFF) << 8) | (low & 0xFF);
short
类型可以表示-32768到32767之间的值.53328不能简单地存储,使用int
代替,因为它允许你存储无符号值~10 9所以不要将表达式向下转换为short,因为它会净你签名值。
尝试连接字节时会发生这种情况(非常微妙)
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);
您可以以更易读和更优雅的方式将2个字节转换为short。
short s = ByteBuffer.wrap(new byte[]{0x01, 0x02}).getShort(); // now s equals 258 = 256 + 2
第一个字节是最重要的字节。