2012-11-15 8 views
20

Ich bin zu wissen, neugierig, warum, wenn ich eine byte Array mit einem Wert vergleichen ...Vergleichen Sie Bytewerte?

boolean match = ((data[0] & 0xFF) == 0xFE); 

... true zurückkehrt, während ...

boolean match = (data[0] == 0xFE); 

... tut nicht? data ist ein byte Array mit

data[0] = (byte) 0xFE; 
+0

Sind Sie Compiler-Warnungen zu bekommen? Ich denke, dass diese Integer-Literale sein könnten (und dann könnte der Vergleich als int erfolgen, mit Ihrer negativen Zahl im Array und dem positiven Ganzzahl-Literal). – Thilo

Antwort

22
boolean match = ((data[0] & 0xFF) == 0xFE); 

vergleicht ganze Zahlen als 0xFF eine ganze Zahl ist, dieser Ausdruck Ihre Bytedata[0] in einem int Scale-up und vergleichen, was zu einem zweiten int 0xFE(254) in der Klammer ist. Wie Sie sagen data[0] ist (byte)0xFE, wird es zunächst auf die ganze Zahl 0xFE skaliert und mit der ganzen Zahl 0xFE verglichen, so dass dies funktioniert.

boolean match = (data[0] == 0xFE); 

vergleicht ein Byte in den int 0xFE: 254

data[0] = (byte) 0xFE; 

ein Byte (es ist also signed) und sein Wert ist -2.

-2 nicht gleich 254, ist also, warum Sie Daten [0] als ein Byte oder als Maßstab auf eine ganze Zahl it up vergleichen muss, bevor er die ganze Zahl 0xFE zu vergleichen.

könnte ein einfacher Vergleich

sein
boolean match = (data[0] == (byte)0xFE); 
+0

Vielen Dank! –

3

Ich glaube, dass es mit der Förderung 0xFF in einen int mit Vorzeichenerweiterung zu tun hat. Im ersten Ausdruck wird 0xFE auch zu einem int hochgestuft und daher ist das Ergebnis von data[0] & 0xFF auch ein int und ein int Vergleich wird gemacht.

Im zweiten Codebeispiel wird jedoch keine Operation ausgeführt, und daher wird nicht zu int weitergeleitet. Das heißt, Daten [0] werden nicht nach int hochgestuft, aber 0xFE ist ein int.