2009-04-27 14 views
5

Ich lese Daten von einem anderen System über den seriellen Anschluss. Ich lese Pakete von 133 Bytes. Das zweite Byte ist die Paketnummer und das dritte Byte ist der negative Wert der Paketnummer.So lesen Sie negative Bytewerte in Java unter -128

Das Problem ist, dass der Typ byte einen Bereich von -128 bis 127 hat Wenn ich versuche, -129 (außerhalb des Bereichs von Byte) zu lesen, es wird der Wert als 127.

geben Was soll ich tun also kann ich -129 bekommen?

Antwort

6

Sie erhalten 127, weil ein Byte nur 8 Bits ist und der Wert sich umwickelt. -129 passt nicht in ein Java-Byte. Sie müssen Ihr Programm ändern, um mindestens Shorts zu verwenden, wenn Sie -129 in eine gegebene Variable passen wollen.

+0

(int) (byteval & 0xFF) es wird korrekte Werte nach + 127, dh-128 als 128, aber ich bekomme nicht für negative Werte –

+0

Nun, sicher. Ein Byte kann ein Bereich von beliebigen 256 Werten sein. Wenn Sie wissen, dass das Byte null oder größer ist, kann es zwischen 0 und 255 liegen. Mit "Byteval & 0xFF" sagen Sie dem Compiler mehr oder weniger, dass es sich um eine vorzeichenlose Ganzzahl handelt, also die niedrigste Zahl ist Null. Sagen Sie, dass Sie einen Bytewert haben, der im Voraus bekannt ist, um negativ zu sein? –

8

Sie müssen bestimmen, welchen Bereich Sie erwarten Byte-Werte zu haben. Wenn Sie beispielsweise den Bereich -129 bis 126 erwarten, können Sie verwenden.

int min = 129; 
int i = ((b + min) & 0xFF) - min; 

BTW Sie können nicht mehr als 256 Wert haben.

4

Ich muss hier ein wenig raten, da ich das Protokoll nicht kenne.

Möglicherweise sollten beide Werte als vorzeichenlose (positive) Bytes im Protokoll behandelt werden, Sie können sie später in ints umwandeln.

// 0-255 
int plus = (int)(plusByte & 0xFF); 

// -255 - 0 
int minus = 0 - (int)(minusByte & 0xFF); 

Ist es zu diesem Us Pat 6313763 verwandt? Aber da die Länge des Pakets fest ist, verstehe ich es nicht.

Es ist nicht möglich, "größere" Zahlen als den Bereich 256 in einem Byte zu speichern. Vielleicht haben Sie das Protokoll missverstanden, und es sind die hohen und niedrigen Bits eines Int in zwei Bytes gespeichert?

1

Werte kleiner als -128 passen nicht in ein vorzeichenbehaftetes Byte. Sie müssen einen kurzen usw. lesen.