我正在尝试将 2 个字节转换为短字节。这 2 个字节代表一个无符号短路,反过来又代表一个端口。我尝试了多种方法将这些字节转换为 java 上的短字节。但是,我经常无法正确地做到这一点。
这些是我尝试过的方法:
byte a = 0x17;
byte b = 0xCC;
(short)((a << 8) | b);
(short)(((short)a << 8) | b);
结果是 0xFFCC,但应该是 0x17CC。
我正在尝试将 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
,因此对结果没有影响。将其转换为短只会缩小左边的 16 位。
要解决它,请在执行操作之前显式屏蔽 with 0xFF
:
(short)(((a&0xFF)<<8)|(b&0xFF))
//试试这个,因为你不能从 int 转换为 byte:
short a = 0x17;
short b = 0xCC;
System.out.println("r = " + String.format("0x%04X", (short)((a << 8) | b)));
//输出:r = 0x17CC