ホームページ > Java > &#&チュートリアル > Java で署名付きバイトを署名なしとして正しく扱うにはどうすればよいですか?

Java で署名付きバイトを署名なしとして正しく扱うにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-26 20:46:18
オリジナル
230 人が閲覧しました

How Can I Correctly Treat Signed Bytes as Unsigned in Java?

Java での署名付きバイトの未署名としての扱い

問題の背景

Java はネイティブではないため、署名付きバイトから符号なしバイトへの変換は Java では困難な場合があります符号なしバイト型をサポートします。したがって、符号付きバイト値が受信され、そのように解釈されると、データの整合性の問題が発生する可能性があります。

試行 1: ビット単位の演算を使用した変換

これに対処するため、一般的な解決策では、ビット単位の演算を使用することが提案されています。次のように:

public static int unsignedToBytes(byte a) {
    int b = a & 0xFF;
    return b;
}
ログイン後にコピー

ただし、戻り値をバイト型に代入し直すことは引き続き結果となるため、このメソッドは望ましい結果を達成できません。

解決策: 手動のダウンキャストと解釈

この問題を解決する鍵は、Java のプリミティブは署名されているが、メモリ内のプリミティブの表現は次のとおりであることを理解することにあります。ない。以下は、バイトを明示的にダウンキャストすることで、バイトを符号なしの値として解釈する修正されたソリューションです。

int i = 200; // 0000 0000 0000 0000 0000 0000 1100 1000 (200)
byte b = (byte) i; // 1100 1000 (-56 by Java specification, 200 by convention)

/*
 * When b is cast back to int, sign extension leads to:
 * 1111 1111 1111 1111 1111 1111 1100 1000 (-56)
 *
 * However, we choose to interpret this as +200 instead.
 */
System.out.println(b); // "-56"

/*
 * To eliminate sign extension, we perform a bitwise AND with 0xFF:
 * 1111 1111 1111 1111 1111 1111 1100 1000 (the int)
 * &
 * 0000 0000 0000 0000 0000 0000 1111 1111 (0xFF)
 * =======================================
 * 0000 0000 0000 0000 0000 0000 1100 1000 (200)
 */
System.out.println(b & 0xFF); // "200"
ログイン後にコピー

上記の例では、整数 i をバイト b にダウンキャストしており、その結果、値は負として解釈されます。 Java の符号付きバイト仕様に従っています。ただし、手動で b と 0xFF のビット単位の AND 演算を行うことで、符号拡張を効果的にクリアし、正しい符号なし値を取得できます。

この手法を使用すると、Java で符号なしバイト値をシームレスに操作でき、正確なデータ処理と言語の制限内での解釈。

以上がJava で署名付きバイトを署名なしとして正しく扱うにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート