首頁 >Java >java教程 >在 Java 中如何正確地將有符號位元組視為無符號位元組?

在 Java 中如何正確地將有符號位元組視為無符號位元組?

Patricia Arquette
Patricia Arquette原創
2024-12-26 20:46:18231瀏覽

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 進行位元與運算,我們可以有效地清除符號擴展並檢索正確的無符號值。

透過使用此技術,您可以在 Java 中無縫處理無符號位元組值,從而確保準確的資料處理和在語言限制內進行翻譯。

以上是在 Java 中如何正確地將有符號位元組視為無符號位元組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn