1

私の問題はこのようなものです。

Javaでバイト単位の計算を行っています。一部の計算では、目的の結果「2a」をバイト値で取得しますが、一部の計算では、バイト値で「ffffff9a」を取得します。結果「ffffff9a」から「9a」の値が欲しいだけです。私はこれを試しましたが、うまくいきませんでした。

byte a = (byte) b & 0xff;

ここで、b の値は "ffffff9a" バイト値です。

しかし、同じプロセスを表示している間は次のように機能します

System.out.println(Integer.toHexString(b & 0xff));

どこが間違っていますか?希望の値を取得するにはどうすればよいですか?

ありがとう


実際、私は 8 ビット文字を gsm 7 ビットに変換しようとしています。また、誰かがこれを通して私を助けることができれば、それも役に立ちます。文字列はバイト配列として格納され、この文字列または 8 ビット バイトを 7 ビットに変換する必要があります。

4

3 に答える 3

8

Javaのbyte型はsignedです。範囲は [-128, 127] です。

System.out.println(Integer.toHexString(a & 0xff)); // note a, not b

aタイプbyteの には負の値( ) が含まれますが、 「正しい値」が表示されます(byte)0x92。つまり、(int)a == 0x92へのキャストは値、負の値、およびすべてをint 保持(a & 0xff) == 0x92するため、false になり、whileは true になります。これは、「符号ビット」(実際には符号ビットではなく、2 の補数のアーティファクト) を「マスキング」しながら、ビット単位&で式を型にプロモートするためです。int

参照: Java バイトを「隠す」方法

ハッピーコーディング。

于 2011-07-14T03:59:59.983 に答える
2

最初のコードは次のとおりです。byte a = (byte) b & 0xff;

タイプキャストは、すでに である に(byte)のみ適用されます。演算子はそれを に拡張したので、. から結果 "ffffff9a" が得られました。bbyte&intint

&型キャストが最初のオペランドだけでなく、の結果に適用されることを確認する必要があります。

byte a = (byte)(b & 0xff);

余分な括弧のペアに注意してください。

于 2011-07-14T09:20:16.683 に答える