[英]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.