2016-07-15 52 views
0

我有一個字節數組,我需要遍歷並根據字節值做一些事情。以下是我的代碼。比較一個字節和十六進制

for (byte b:byteArray) 
    { 

     if(b>=(byte)0x00 && b<=(byte)0x1F) 
     { 
      //do something 
     } 
     else if(b>=(byte)0x20 && b <=(byte)0xFE) 
     { 
      //do something 
     } 
     else if(b ==(byte)0xFF) 
     { 
      //do something 
     } 
    } 

我的問題字節比較沒有按照我的預期發生。

假設我的字節數組中的值是{31, -117, 8, 0 , -1},我擁有的代碼無法檢測到它們各自範圍內的所有負數字節值。例如。 -117應該在0x200xFE之間,但它不會達到任何範圍。

我跟着this answer來比較字節。我無法弄清楚代碼中的錯誤。

提前致謝!

+1

'(字節)0xFE'實際上是'-2' –

+2

字節是用Java簽名的。因此,b <=(byte)0xFE'只有兩個值:0xfe和0xff。 – EJP

+0

@EJP我應該如何改變我的邏輯來覆蓋以下兩個範圍中的所有可能的字節:0x00-0x1f和0x20-0xFE。對不起,如果問題是非常基本的,但我一直無法弄清楚。 – Exception

回答

2

你的關係只對無符號字節有意義 - 這在Java中不存在。

試試這個:

for (byte b:byteArray) 
{ 
    int ib = b & 0xFF;   // This scales up to integer so you have values 0-255 
    if(ib >=0x00 && ib<=0x1F) 
    { 
     //do something 
    } 
    else if(ib>=0x20 && ib <=0xFE) 
    { 
     //do something 
    } 
    else if(ib == 0xFF) 
    { 
     //do something 
    } 
    else 
    { 
     // log a bug! This should never happen! 
    } 
} 

在您的解決方案是-117 0x8B,這實際上是小於0x20的(32月),所以它不符合第二個路徑標準b >= 0x20。實際上,這會產生無法訪問的代碼,因爲值大於32 < = -2。

+0

謝謝!有效 – Exception

1

Java中的字節是默認簽名的。一種解決方法有無符號字節是類似的東西有:int num = (int) bite & 0xFF

它是如何工作的,讓我們假設byte b = -128;這被表示爲1000 0000

int num = (int)b; NUM現在是-128和二進制表示法是這樣的:

1111 1111 1111 1111 1111 1111 1000 0000 

讓我們比較num & 0xFF二進制嗎?

1111 1111 1111 1111 1111 1111 1000 0000 
& 
0000 0000 0000 0000 0000 0000 1111 1111 

結果是0000 0000 0000 0000 0000 0000 1000 0000,它是128,這意味着你的符號值轉換爲無符號值。