2016-07-15 17 views
0

Ich habe eine Byte-Array, die ich durchlaufen muss und basierend auf dem Byte-Wert etwas tun. Unten ist mein Code dafür.Vergleichen Sie ein Byte und und hexadezimal

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 
     } 
    } 

Mein Problem der Byte-Vergleich passiert nicht wie erwartet.

Angenommen, die Werte in meinem Bytearray sind {31, -117, 8, 0 , -1}, der Code, den ich habe, ist nicht in der Lage, alle negativen Bytewerte in ihrem jeweiligen Bereich zu erkennen. Für Beispiel -117 sollte zwischen 0x20 und 0xFE liegen, aber es geht nicht um irgendeinen Bereich.

Ich habe this answer gefolgt, um Bytes zu vergleichen. Ich kann nicht herausfinden, was im Code falsch ist.

Vielen Dank im Voraus!

+1

'(Byte) 0xFE' ist eigentlich' -2' –

+2

Byte sind in Java signiert. 'b <= (byte) 0xFE' gilt daher nur für zwei Werte: 0xfe und 0xff. – EJP

+0

@EJP Wie soll ich meine Logik ändern, um alle möglichen Bytes in den folgenden zwei Bereichen abzudecken: '0x00-0x1f' und' 0x20-0xFE'. Tut mir leid, wenn die Frage sehr einfach ist, aber ich konnte es nicht herausfinden. – Exception

Antwort

2

Ihre Beziehungen sind nur für vorzeichenlose Bytes sinnvoll, die in Java nicht existieren.

Try this:

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! 
    } 
} 

In Ihrer Lösung -117 ist 0x8B, die in der Tat weniger als 0x20 (32 Dezember), so dass es b >= 0x20 die zweiten Weg Kriterien nicht erfüllt. Tatsächlich erzeugt dies unerreichbaren Code, weil kein Wert> 32 und < = -2 ist.

+0

Danke! Es funktionierte – Exception

1

Bytes in Java sind standardmäßig signiert. Eine Abhilfe unsigned Bytes haben, ist etwas ähnliches mit: int num = (int) bite & 0xFF

Wie es funktioniert, ist byte b = -128 Nehmen wir an, dieser vertreten ist als 1000 0000

int num = (int)b; num jetzt -128 und binäre Darstellung ist wie folgt:

1111 1111 1111 1111 1111 1111 1000 0000 

Lets vergleichen num & 0xFF im Binärformat?

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

Das Ergebnis ist 0000 0000 0000 0000 0000 0000 1000 0000, die 128, was bedeutet, Ihr Wert mit Vorzeichen in unsigned Wert umgewandelt wird.