我正在从串口读取 133 个长度的数据包,最后 2 个字节包含 CRC 值,2 个字节值我使用 java 制作了单个(我认为很短)。这就是我所做的,
short high=(-48 & 0x00ff);
short low=80;
short c=(short) ((high<<8)+low);
但我没有得到正确的结果,是因为签名值有问题吗?我该如何解决这个问题,请帮助我,我有麻烦了
我正在从串口读取 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));
我发现在这些情况下最好用括号明确。
尝试连接字节时会发生这种情况(非常微妙)
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);
其他答案还可以,但我想强调一下类型:
short high=(-48 & 0x00ff);
short low=80;
int c= ((high & 0xFF) << 8) | (low & 0xFF);
该short
类型可以表示 -32768 到 32767 之间的值。53328 不能很好地存储在 short 中,int
而是使用它,因为它允许您将无符号值存储到 ~10 9
所以不要将表达式向下转换为 short ,因为它会让你得到有符号的价值。
您可以以更易读和更优雅的方式将 2 个字节转换为短字节。
short s = ByteBuffer.wrap(new byte[]{0x01, 0x02}).getShort();
// now s equals 258 = 256 + 2
第一个字节是最高有效字节。
这对我有用
short temp = ;
result[0] = (byte) ((temp >>> 8) & 0xFF);
result[1] = (byte)((temp) & 0xFF);