0

我正在捕捉一個串行流並試圖佔用兩個字節,並將它們轉換爲處理中的已簽名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。 有什麼想法?

回答

3

這裏有一個提示:A7是一個大於128的數字。而Java將字節視爲有符號。

您需要在代碼中添加一些foo & 255。

例如查看DataInputStream.readLong()的源代碼。