Java 移位字节返回意外结果

Posted

技术标签:

【中文标题】Java 移位字节返回意外结果【英文标题】:Java shifting bytes returns an unexpected result 【发布时间】:2016-04-26 13:35:31 【问题描述】:

我正在尝试将 2 个字节转换为短字节。这 2 个字节代表一个无符号短路,反过来又代表一个端口。我尝试了多种方法将这些字节转换为 java 上的短字节。但是,我总是无法正确地做到这一点。

这些是我尝试过的方法:

byte a = 0x17;
byte b = 0xCC;

(short)((a << 8) | b);
(short)(((short)a << 8) | b);

结果是 0xFFCC,但应该是 0x17CC。

【问题讨论】:

【参考方案1】:

在 Java 中进行算术运算的任何值首先被转换为可以覆盖两个操作数的更高类型。如果两个操作数都更小,则它们都将转换为 int

因此,b 首先转换为 int,然后变为 0xFFFFFFCC。将其与向左移动 8 位的任何内容进行或运算始终保持掩码 0xFFFFFF00,因此对结果没有影响。将其转换为短只会缩小左边的 16 位。

要解决它,请在执行操作之前使用0xFF 显式屏蔽:

(short)(((a&0xFF)<<8)|(b&0xFF))

【讨论】:

【参考方案2】:

//试试这个,因为你不能从int转换为byte:

short a = 0x17; short b = 0xCC; System.out.println("r = " + String.format("0x%04X", (short)((a &lt;&lt; 8) | b)));

//输出:r = 0x17CC

【讨论】:

以上是关于Java 移位字节返回意外结果的主要内容,如果未能解决你的问题,请参考以下文章

php函数返回意外 (可能是unicode或字节码引起的)

NumberFormat.parse 返回意外结果

NSDateComponents 返回意外结果

核心数据提取返回意外结果

为啥此代码片段返回意外结果?

挂钩 ExtTextOut 会返回意外结果