簡體   English   中英

如何屏蔽 Java 中的字節值?

[英]How to mask byte value in Java?

我的問題是這樣的。

我在 Java 中有一些字節計算。 在某些計算中,我得到了我想要的字節值結果“2a”,但在某些計算中,我得到了字節值中的“ffffff9a”。 我只想要結果“ffffff9a”中的“9a”值。 我試過這個但沒有用。

byte a = (byte) b & 0xff;

其中 b 具有值“ffffff9a”字節值。

但是在顯示相同的過程時,就像

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

我哪里錯了? 我能做些什么來獲得我想要的價值?

謝謝


實際上我正在嘗試將 8 位字符轉換為 gsm 7 位。 此外,如果有人可以幫助我解決這個問題,那也會很有幫助。 字符串存儲為字節數組,我必須將此字符串或 8 位字節轉換為 7 位。

Java 中的byte類型是有符號的。 它的范圍為 [-128, 127]。

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

即使byte類型的a包含負值(byte)0x92 ),也會顯示“正確的值”。 也就是說, (int)a == 0x92將是假的,因為轉換為int會保留值,負數和全部,而(a & 0xff) == 0x92將是真。 這是因為按位&將表達式提升為int類型,同時“屏蔽”了“符號位”(不是真正的符號位,而是二進制補碼的偽影)。

請參閱: Java 如何“隱藏”字節

快樂編碼。

您的初始代碼是: byte a = (byte) b & 0xff;

(byte)類型轉換僅適用於b ,它已經是一個byte 然后&運算符將其擴展為int ,因此您從int獲得結果“ffffff9a”。

您需要確保您的類型轉換適用於&的結果,而不僅僅是它的第一個操作數:

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

注意額外的一對括號。

//bit is zero base
public static boolean isSet(byte value, int bit)
{
    int b = (int)value & 0xff;
    b >>= bit;
    b &= 0x01;
    if( b != 0 )
    {
        return true;
    }
    return false;
}
public static byte setBit(byte value, int bit)
{
    int b = (int)value;

    b |= (1 << bit);
    return (byte)(b & 0xff);
}
public static byte clearBit(byte value, int bit)
{
    int b = (int)value;

    b &= ~(1 << bit);
    return (byte)(b & 0xff);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM