Java はネイティブではないため、署名付きバイトから符号なしバイトへの変換は Java では困難な場合があります符号なしバイト型をサポートします。したがって、符号付きバイト値が受信され、そのように解釈されると、データの整合性の問題が発生する可能性があります。
これに対処するため、一般的な解決策では、ビット単位の演算を使用することが提案されています。次のように:
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 サイトの他の関連記事を参照してください。