Heim > Java > javaLernprogramm > Wie kann ich signierte Bytes in Java korrekt als nicht signierte Bytes behandeln?

Wie kann ich signierte Bytes in Java korrekt als nicht signierte Bytes behandeln?

Patricia Arquette
Freigeben: 2024-12-26 20:46:18
Original
230 Leute haben es durchsucht

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

Vorzeichenbehaftete Bytes in Java als vorzeichenlos behandeln

Problemhintergrund

Die Konvertierung von vorzeichenbehafteten in vorzeichenlose Bytes kann in Java eine Herausforderung sein, da Java dies nicht nativ tut unterstützt vorzeichenlose Bytetypen. Wenn daher vorzeichenbehaftete Bytewerte empfangen und als solche interpretiert werden, können Probleme mit der Datenintegrität auftreten.

Versuch 1: Konvertierung mithilfe einer bitweisen Operation

Um dieses Problem zu beheben, schlägt eine gängige Lösung die Verwendung einer bitweisen Operation vor wie folgt:

public static int unsignedToBytes(byte a) {
    int b = a & 0xFF;
    return b;
}
Nach dem Login kopieren

Diese Methode erzielt jedoch nicht das gewünschte Ergebnis, da das Zurückweisen des zurückgegebenen Werts auf einen Bytetyp immer noch zu einer vorzeichenbehafteten Interpretation führt. Dies führt zu Datenverzerrungen.

Lösung: Manuelles Downcasting und Interpretation

Der Schlüssel zur Lösung dieses Problems liegt im Verständnis, dass Grundelemente in Java zwar signiert sind, ihre Darstellung im Speicher jedoch nicht. Hier ist eine modifizierte Lösung, die das Byte als vorzeichenlosen Wert interpretiert, indem es explizit heruntergestuft wird:

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"
Nach dem Login kopieren

Im obigen Beispiel haben wir eine ganze Zahl i auf ein Byte b heruntergestuft, was dazu führt, dass der Wert als negativ interpretiert wird gemäß den vorzeichenbehafteten Byte-Spezifikationen von Java. Durch die manuelle bitweise UND-Verknüpfung von b mit 0xFF löschen wir jedoch effektiv die Vorzeichenerweiterung und rufen den korrekten vorzeichenlosen Wert ab.

Mit dieser Technik können Sie nahtlos mit vorzeichenlosen Bytewerten in Java arbeiten und so eine genaue Datenverarbeitung gewährleisten Interpretation innerhalb der Grenzen der Sprache.

Das obige ist der detaillierte Inhalt vonWie kann ich signierte Bytes in Java korrekt als nicht signierte Bytes behandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage