2016-06-12 14 views
3

Ich habe ein Array von Bytes, die zu einem Array von Longs umgepackt werden muss. das Eingabe-Byte-Array hat eine unbekannte Größe (ungefähr von 0 bis einigen hundert). das lange Array muss herauskommen rechtsbündig dh der niedrigste Index lang sollte mit Nullen aufgefüllt werden und alle anderen sollten voll mit den Eingangsbytes sein: . (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11) -> (xxxxb0b1b2b3, b4b5b6b7b8b9b10b11)ordentlich konvertieren Byte [] zu lang [] in Java

wo b1, b2 usw. ist ein gegebenes Byte. ich habe eine Lösung, aber es ist nicht sehr ordentlich oder lesbar:

// outArr has length (inArr.length+7)/8 

for (int i = 0; i < inArr.length ; i++) {  
    outArr[outArr.length - i/8 - 1] |= ((long)inArr[inArr.length - i - 1]) << (i % 8) * 8; 
    } 

gibt es eine weniger hässliche Art und Weise, dies zu tun?

+0

bitte einen Blick auf http://stackoverflow.com/questions/4485128/how-do-i- convert-long-to-byte-und-back-in-java –

Antwort

2

Es mag elegantere Methoden geben, aber man könnte einen java.nio-Puffer verwenden, um ihn zu konvertieren. Wegen der Notwendigkeit, den Eingangs-Array zu 8 Byte Chunks auszurichten, ist es noch ein paar Schritte erfordert:

int padding = outArr.length * 8 - inArr.length; 
ByteBuffer buffer = ByteBuffer.allocate(inArr.length + padding) 
           .put(new byte[padding]).put(inArr); 
buffer.flip(); 
buffer.asLongBuffer().get(outArr); 
+0

'ByteByffer.wrap (inArr)' ist yetl ein bisschen kürzer. Und 'order (LITTLE_ENDIAN)' könnte benötigt werden. Aber tatsächlich ist ByteBuffer die Lösung. –

+0

Ja, das wäre kürzer, aber es würde das _whole_ Problem nicht lösen, da das Padding benötigt wird, da Sie zuerst ein korrekt aufgefülltes Byte-Array haben müssen. Ich baue den Byte-Puffer mit zwei 'put()' und 'flip()'. Bezüglich der Bestellung; Der Standard "BIG_ENDIAN" ist der richtige. –