我正在尝试将 2 个字节转换为一个短字节。这 2 个字节代表一个无符号短整数,它又代表一个端口。我已经尝试了多种方法将这些字节转换为 java 上的短字节。然而,我总是不能正确地做到这一点。
这些是我尝试过的方法:
byte a = 0x17;
byte b = 0xCC;
(short)((a << 8) | b);
(short)(((short)a << 8) | b);
结果是0xFFCC,但应该是0x17CC。
最佳答案
任何在 Java 中进行算术运算的值,首先被转换为可以覆盖两个操作数的更高类型。如果两个操作数仍然更小,则将它们转换为 int
。
因此,b
首先被转换为 int
并变为 0xFFFFFFCC
。将它与向左移动 8 位的任何内容进行或运算始终保持掩码 0xFFFFFF00
,因此对结果没有影响。将其转换为 short 只会缩小左边的 16 位。
要解决它,请在执行操作之前用 0xFF
显式屏蔽:
(short)(((a&0xFF)<<8)|(b&0xFF))
关于Java 移位字节返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36866581/