2013-02-12 11 views
17

Ich habe ein Byte-Array, wo die Daten im Array tatsächlich kurze Daten sind. Die Bytes werden in little endian bestellt:Konvertieren von Byte-Array-Werten in Little-Endian-Reihenfolge in kurze Werte

3, 1, -48, 0, -15, 0, 36, 1

die, wenn sie in zu kurzen Werte umgewandelt Ergebnisse:

259, 208, 241, 292

Gibt es einen einfachen Weg in Java, um die Byte-Werte in ihre entsprechenden kurzen Werte zu konvertieren? Ich kann eine Schleife schreiben, die nur jedes High-Byte nimmt und es um 8 Bits verschiebt, und ODER es mit seinem Low-Byte, aber das hat einen Leistungseinbruch.

+2

Sie gegeben haben 8 Bytes und dann 4 longs ... wobei 8 Bytes nur zu einem * single * long Wert führen sollten. Außerdem haben Sie nicht gesagt, was Sie erwartet haben. Grundsätzlich ist Ihre Frage im Moment sehr unklar ... –

+1

Nein, es ist nicht unklar. Sie haben die Daten aus dem Byte-Array und was es konvertiert. Kann nicht offensichtlicher sein als das. – AndroidDev

+8

Ja, kann es. Weil es sich anhört, als würdest du * tatsächlich * zu 'short', nicht' long' konvertieren ... und du hast nicht gesagt, was du * erwartest * die Ergebnisse sein. Fühlen Sie sich frei, die Frage nicht klarer zu machen - aber denken Sie daran, dass Sie derjenige sind, der Hilfe sucht, und je besser Ihre Frage ist, desto besser ist die Hilfe. –

Antwort

38

Mit java.nio.ByteBuffer können Sie die Endianess angeben, die gewünscht wird: order().

ByteBuffer haben Methoden, um Daten als Byte zu extrahieren, Saibling, getShort(), getInt(), lang, doppelt ...

Hier ein Beispiel ist, wie es zu benutzen:

ByteBuffer bb = ByteBuffer.wrap(byteArray); 
bb.order(ByteOrder.LITTLE_ENDIAN); 
while(bb.hasRemaining()) { 
    short v = bb.getShort(); 
    /* Do something with v... */ 
} 
+1

Danke. Hat viel geholfen. Freut mich zu sehen, dass jemand die Frage leicht verstehen kann. Tausend Dank. – AndroidDev

+1

(Erwarten Sie 'getLong()' nicht, um * zwei * Bytes gemäß den Beispieldaten in der Frage zu konvertieren. Sie würden 'getShort()' dafür aufrufen.) –

+0

Eigentlich möchte ich getShort, was gibt mir die Ergebnisse. Trotzdem ist deine Lösung die richtige. – AndroidDev

0
/* Try this: */ 
public static short byteArrayToShortLE(final byte[] b, final int offset) 
{ 
     short value = 0; 
     for (int i = 0; i < 2; i++) 
     { 
      value |= (b[i + offset] & 0x000000FF) << (i * 8); 
     }    

     return value; 
} 

/* if you prefer... */ 
public static int byteArrayToIntLE(final byte[] b, final int offset) 
{ 
     int value = 0; 

     for (int i = 0; i < 4; i++) 
     { 
      value |= ((int)b[i + offset] & 0x000000FF) << (i * 8); 
     } 

     return value; 
} 
Verwandte Themen