2011-07-14 53 views
1

我的問題是這樣的。如何屏蔽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位。

+0

您的代碼看起來不錯,仔細檢查您是否正確測試它?也許顯示整個例程? 'b'是字節類型嗎? – fileoffset

+0

似乎很好''System.out.println(Integer.toHexString(0xffffff9a&0xff));'打印'9a http:// ideone。com/ikxuO –

+0

是b是類型字節,並且打印很好,我想將值存儲在變量中,問題是 – bunkdeath

回答

7

在Java中的byte類型是簽署。它有一個範圍[-128,127]。

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

會顯示 「正確的價值」,即使a,這是byte類型,都會包含負值(byte)0x92)。也就是(int)a == 0x92會因爲投到int而保持的值,負值和全部,而(a & 0xff) == 0x92將爲true。這是因爲按位&將表達式提升爲int類型,同時「掩蓋」「符號位」(不是真正的符號位,而是二進制補碼的人工製品)。

參見:Java How To "Covert" Bytes

快樂編碼。

+0

感謝pst,這很有幫助。 – Sumit

2

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

(byte)類型轉換僅適用於b,這已經是一個byte。然後&運營商將其擴大到int,所以你從int得到結果「ffffff9a」。

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

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

注額外對括號。

+0

我也試過(額外的括號),但結果是一樣的。 – bunkdeath

0
//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); 
}