0

シリアルストリームを捕捉して2バイトを取り込み、処理中の符号付きshortにしようとしています。コードはシンプルですが、2バイトを組み合わせると時折グリッチが発生します。これは内部にたくさんのプリントがあるコードです。ビット単位のOR処理エラー

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()のソースコードを確認してください。