0

我花了一天的大部分时间追查二进制重建错误,并想了解原因:

特定的代码行如下所示(dataBuffer是一个字节数组):

short data = (short) ((short)dataBuffer[curPos + 3] << 8 | ((short)dataBuffer[curPos + 2]));

它偶尔会返回垃圾,直到我为低位词添加掩码:

short data = (short) ((short)dataBuffer[curPos + 3] << 8 | (((short)dataBuffer[curPos + 2])) & 0xff);

所以,我的解释是,从byteto的类型转换short偶尔会在高位词中留下垃圾,在它被 or-ed 时引起问题......但这并没有多大意义。

这段代码取自 c++ 并在那里工作得很好......我错过了什么?

4

1 回答 1

3

是符号扩展。Java 中的所有byte值都是有符号的,因此任何大于 127 的字节值实际上都是负数。因此,例如 0x90(十进制 = 144)的字节值在它是 a 时实际上被视为 -112 byte。当它扩大到 ashort时,它变为 0xff90(仍然是 -112)。您需要使用 0xff 屏蔽该值以恢复所需的0x0090.

顺便说一句,您可以从第二个表达式中消除几个强制转换:

short data = (short) ((dataBuffer[curPos + 3] << 8) | (dataBuffer[curPos + 2] & 0xff));

事实上,这些演员阵容毫无用处。在应用运算符之前,按位运算符的操作数始终提升为int1

1或者long,如果有的话long

于 2013-04-23T03:36:17.707 回答