我想将2个字节移入一个短。这2个字节表示一个无符号的短路,它反过来表示一个端口。我已经尝试了多种方法将这些字节转换为java中的简短字符。但是,我经常无法正确地做到这一点。Java移位字节返回一个意外的结果
这是我试过的方法:
byte a = 0x17;
byte b = 0xCC;
(short)((a << 8) | b);
(short)(((short)a << 8) | b);
结果是0xFFCC,但应该是0x17CC。
我想将2个字节移入一个短。这2个字节表示一个无符号的短路,它反过来表示一个端口。我已经尝试了多种方法将这些字节转换为java中的简短字符。但是,我经常无法正确地做到这一点。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
,因此对结果没有影响。将它缩短就会缩小左边的16位。
要解决这个问题,做术前与0xFF
明确面膜:
(short)(((a&0xFF)<<8)|(b&0xFF))
//试试这个,因为你不能从int转换为字节:
short a = 0x17;
short b = 0xCC;
System.out.println("r = " + String.format("0x%04X", (short)((a << 8) | b)));
//输出:r = 0x17CC
谢谢你,终于有用! :)阅读完它后,确实有很多的意义.. – Max