2010-12-20 10 views
15

Ich muss konvertieren 2 Byte Array (Byte [2]) zu Integer-Wert in Java. Wie kann ich das machen?Java: Konvertieren von Byte zu Ganzzahl

+5

Diese Frage könnte einige Klarstellungen verwenden. So wie es jetzt aussieht, werden wir nur sehen, was Sie mit welcher Antwort meinen. –

Antwort

24

können Sie ByteBuffer für diesen Einsatz:

ByteBuffer buffer = ByteBuffer.wrap(myArray); 
buffer.order(ByteOrder.LITTLE_ENDIAN); // if you want little-endian 
int result = buffer.getShort(); 

Siehe auch Convert 4 bytes to int.

+5

+1 für ByteBuffer Lösung – Casey

+0

Vielen Dank, dies funktioniert. Will ByteBuffer kümmert sich um signierte und vorzeichenlose Bytes? – keshav

+0

@keshav: was meinst du? Es gibt kein "signiertes" oder "vorzeichenloses" Byte. Ein Byte ist nur eine Gruppe von "0" und "1"; Die ** einzige ** Bedeutung besteht darin, wie Sie diese Zahlen interpretieren. –

3

Nun, jedes Byte ist eine Ganzzahl im Bereich -128..127, also müssen Sie ein Paar von Integer auf eine einzelne ganze Zahl abbilden. Es gibt viele Möglichkeiten, dies zu tun, abhängig davon, was Sie in dem Byte-Paar codiert haben. Am gebräuchlichsten ist das Speichern einer 16-Bit-Ganzzahl mit Vorzeichen als ein Paar von Bytes. Konvertieren, dass auf eine ganze Zahl zurück hängt davon ab, ob Sie es speichern Big-Endian-Form:

(byte_array[0]<<8) + (byte_array[1] & 0xff) 

oder Little-Endian:

(byte_array[1]<<8) + (byte_array[0] & 0xff) 
10

In Java Bytes unterzeichnet werden, was bedeutet, dass der Wert eines Byte negativ sein kann Und wenn das passiert, wird die ursprüngliche Lösung von @ MattBall nicht funktionieren.

Wenn beispielsweise die binäre Form des Bytes Array wie folgt ist:

dann myArray [0] ist 1000 1101 und myArray [1] ist 1000 1101, die Dezimalwert Byte ist 1000 1101-115 anstelle von 141 (= 2^7 + 2^3 + 2^2 + 2^0)

wenn wir verwenden

int result = (myArray[0] << 8) + myArray[1]

der Wert würde -16191 sein, was WRONG ist.

Der Grund, warum seine falsch ist, dass, wenn wir einen 2-Byte-Array in integer, alle Bytes sind nicht unterzeichnet, so beim Übersetzen interpretieren, sollten wir die signierten Bytes unsigned integer Karte:

((myArray[0] & 0xff) << 8) + (myArray[1] & 0xff)

das Ergebnis ist 36237, verwenden Sie einen Taschenrechner oder ByteBuffer, um zu überprüfen, ob es korrekt ist (Ich habe es getan, und ja, es ist richtig).

+0

vielen Dank für die Erklärung :) – shadygoneinsane

3

Auch, wenn Sie die Guava Bibliothek verwenden können:

Ints.fromByteArray(0, 0, myArray[1], myArray[0]); 

Es war erwähnenswert, da viele Projekte es trotzdem verwenden.

3

einfach dies zu tun:

return new BigInteger(byte[] yourByteArray).intValue(); 

große Arbeiten über Bluetooth Befehl Conversions etc. Keine Notwendigkeit, über vs. unsigned Umwandlung unterzeichnet zu kümmern.