2010-12-09 10 views
4

Ich muss Daten als LITTLE_ENDIAN anstelle von Standard BIG_ENDIAN speichern.Java Little Endian Auftrag

Hier ist mein Beispielcode:

for (int i = 0; i < logo.length; i++) { 
    logoArray[i] = ((Integer) logo[i]).byteValue(); 

    logoArray[i] = (byte) (((logoArray[i] & 1) << 7) + ((logoArray[i] & 2) << 5) + ((logoArray[i] & 4) << 3) 
     + ((logoArray[i] & 8) << 1) + ((logoArray[i] & 16) >> 1) + ((logoArray[i] & 32) >> 3) 
     + ((logoArray[i] & 64) >> 5) + ((logoArray[i] & 128) >> 7)); 
} 

Wie soll es mit ByteBuffer neu geschrieben werden, für LITTLE_ENDIAN, wie der folgende Code nicht für mich arbeiten:

ByteBuffer record = ByteBuffer.allocate(logo.length); 
record.order(ByteOrder.LITTLE_ENDIAN); 
... 
record.put(((Integer) logo[i]).byteValue()); 
... 
record.array(); // get 
+0

* Wo * tun müssen, um die Daten speichern? – Mot

Antwort

2

ByteBuffer für Sie arbeiten , wenn Sie putInt und nicht put verwenden.

record.putInt((Integer) logo[i]); 

ein Byte-Array (als Integer.byteValue()) hat keine "endianness", damit es gespeichert wird, wie sie ist.

+1

Sie brauchen also nicht die (Integer) Besetzung. Es verlangsamt nur die Dinge massiv. – EJP

+0

In der Frage ist es nicht klar, ob logo [] ein Array von Ganzzahlen ist, also habe ich die Besetzung an Ort und Stelle gelassen. – andcoz

3

Wie andcoz sagt, wird der Endian nicht berücksichtigt, wenn Sie ein Byte auf einmal setzen. Hier ist ein Beispiel zu zeigen, wie man es tun:

import java.nio.*; 

public class Test { 

    public static void main(String[] args) { 

     int[] logo = { 0xAABBCCDD, 0x11223344 }; 
     byte[] logoLE = new byte[logo.length * 4]; 

     ByteBuffer rec = ByteBuffer.wrap(logoLE).order(ByteOrder.LITTLE_ENDIAN); 

     for (int i = 0; i < logo.length; i++) 
      rec.putInt(logo[i]); 

     // Debug printouts... 
     System.out.println("logo:"); 
     for (int b : logo) 
      System.out.println(Integer.toHexString((b < 0 ? b + 256 : b))); 

     System.out.println("\nlogoLE:"); 
     int tmp = 0; 
     for (byte b : logoLE) { 
      System.out.print(Integer.toHexString((b < 0 ? b + 256 : b))); 
      if (++tmp % 4 == 0) 
       System.out.println(); 
     } 
    } 
} 

Ausgang:

logo: 
aabbccdd 
11223344 

logoLE: 
ddccbbaa 
44332211 
Verwandte Themen