我正在尝试将2个字节转换为短字节。这2个字节表示无符号短路,而后者又代表端口。我已经尝试了多种方法将这些字节转换为简短的java。但是,我经常无法正确地做到这一点。
这些是我尝试的方式:
byte a = 0x17;
byte b = 0xCC;
(short)((a << 8) | b);
(short)(((short)a << 8) | b);
结果是0xFFCC,但应该是0x17CC。
答案 0 :(得分:5)
在Java中经历算术运算的任何值,首先被转换为可以覆盖两个操作数的更高类型。如果它们仍然较小,则两个操作数都被强制转换为int
。
因此,b
首先投放到int
并变为0xFFFFFFCC
。对于向左移动8位的任何内容进行排序,始终保持掩码0xFFFFFF00
,因此对结果没有影响。将它转换为short只会缩小左边的16位。
要解决此问题,请在执行操作前使用0xFF
显式屏蔽:
(short)(((a&0xFF)<<8)|(b&0xFF))
答案 1 :(得分:0)
//试试这个,因为你不能从int转换为byte:
short a = 0x17;
short b = 0xCC;
System.out.println("r = " + String.format("0x%04X", (short)((a << 8) | b)));
//输出:r = 0x17CC