1

Java では、ファイルを ByteBuffer に読み込むだけです。ByteBuffer に正しいバイトが含まれていることを確認するためにチェックを開始したとき、3 番目のバイトを除いて、ほとんど正しい開始バイトと終了バイトがあることに気付きました。emacs が 139 である必要があると言う代わりに -117 になっています (16 進数で 8b -モード)。何を与える?これは、ビッグ/リトル エンディアンと関係がありますか?

明確にするために、emacs によると、最初の 4 バイトは次のようになります。

31 139 8 0 に等しい 1f:8b:08:00

そして私のJavaは次のようになります:

31 -117 8 0

何か案は?

4

3 に答える 3

5

Javabyteは署名されているため、その範囲は 0..255 ではなく -128..127 です。それを考慮すると、あなたのバイトは正しいです。バイトの符号なしの値が の場合、符号付きの値Xはです。(X - 256)したがって、 の場合、符号付き139の値は です139 - 256 = -117

于 2009-08-27T22:48:48.447 に答える
3

Java の整数型 ( を含むbyte) はsignedです。予想されるような 0 から 255 ではなく、-128 から 127 の範囲です。上位ビットが 1 (1### ####) の数値はすべて負になります。

多くの人がこれについて書いています。

于 2009-08-27T22:50:21.953 に答える
2

これは少し接線ですが、符号付きバイトを操作しようとしている場合は、次の方法が役立つ場合があります。

ほとんどの操作は、符号と大きさを保持して Javabyteをプロモートするためint、次のように上位ビットをマスクするのが非常に一般的です。

/* Convert two bytes from an array to a 16-bit, unsigned value. */
int val = (b[idx] & 0xFF) << 8 | (b[idx + 1] & 0xFF);

&演算子 (および他のほとんどの演算子) を適用する前に、 a は an (コンテキストによってはa でさえ) にbyte拡張されます。したがって、 の符号付きバイト値はの符号付き整数値に変換されます。intlong0xFF0xFFFFFF

ただし、通常、ビット単位の操作を行う場合、各バイトを符号なしの値として扱う意図があるため、byte 0xFF(-1) はint 0xFF(255) にする必要があります。でのマスキングはこれを0xFF実現します。

于 2009-08-27T23:10:21.240 に答える