处理按位或失败
问题描述:
我正在捕捉一个串行流并试图占用两个字节,并将它们转换为处理中的已签名short。代码很简单,但是当我组合两个字节时偶尔会出现一些小问题。这是有很多内部打印的代码。处理按位或失败
println(hex(inBuffer[i-2]) + " " + hex(inBuffer[i-3]));
x = inBuffer[i-2];
println(hex(x));
x <<= 8;
println(hex(x));
println(hex(inBuffer[i-3]));
x = (short) (x | inBuffer[i-3]);
println(hex(x));
for (int j=15; j>=0; j--){
print(((1<<j) & x)>>j);
}
println("");
println(x);
println("");
有时我得到这个,这是伟大的:
41 27
00000041
00004100
27
00004127
0100000100100111
16679
这是伟大的!但有时我得到这个:
41 A7
00000041
00004100
A7
FFFFFFA7
1111111110100111
-89
这不是很好。我不知道为什么(0xA7 | 0x004100) = 0xFFFFFFA7
。 有什么想法?
答
这里有一个提示:A7是一个大于128的数字。而Java将字节视为有符号。
您需要在代码中添加一些foo & 255。
例如查看DataInputStream.readLong()的源代码。