2013-01-24 15 views
5

Mam obecnie Java ByteBuffer, który ma już dane w formacie Big Endian. Następnie chcę napisać do pliku binarnego jako Little Endian.Jak pisać big endian ByteBuffer do little endian w Javie

Oto kod, który po prostu zapisuje plik nadal w Big Endian:

public void writeBinFile(String fileName, boolean append) throws FileNotFoundException, IOException 
{ 
    FileOutputStream outStream = null; 
    try 
    { 
     outStream = new FileOutputStream(fileName, append); 
     FileChannel out = outStream.getChannel(); 
     byteBuff.position(byteBuff.capacity()); 
     byteBuff.flip(); 
     byteBuff.order(ByteOrder.LITTLE_ENDIAN); 
     out.write(byteBuff); 
    } 
    finally 
    { 
     if (outStream != null) 
     { 
      outStream.close(); 
     } 
    } 

} 

Zauważ, że byteBuff jest ByteBuffer który został wypełniony w formacie Big Endian.

Moja ostatnia metoda to brutalna metoda tworzenia kolejnego bufora i ustawiania ByteBuffer na little endian, a następnie odczytania wartości "getInt" z oryginalnego (dużego endianu) bufora i "setInt" wartości dla małego endianina bufor. Wyobrażam sobie, że jest lepszy sposób ...

+1

Czy wypróbowałeś już Apache commons (http://commons.apache.org/io/api-release/org/apache/commons/io/EndianUtils.html)? –

+0

+1 dla Apache Commons: nie wymyślanie koła :) – BachT

Odpowiedz

4

Endianess nie ma znaczenia dla bajtu []. Endianess ma znaczenie tylko dla wielobajtowych typów danych, takich jak short, int, long, float lub double. Właściwy czas, aby uzyskać poprawne wyniki, to zapisywanie nieprzetworzonych danych do bajtów i odczytywanie aktualnego formatu.

Jeśli masz podany bajt [], musisz odkodować oryginalne typy danych i ponownie je zakodować z różną endianialnością. Jestem pewien, że zgodzisz się, że jest to a) nie jest łatwe do zrobienia lub idealne b) nie można zrobić automagicznie.

3

Oto jak rozwiązać podobny problem, chcąc uzyskać „bajt” z całkowitymi Piszę do pliku wyjściowego popraw:

byte[] theBytes = /* obtain a byte array that is the input */ 
ByteBuffer byteBuffer = ByteBuffer.wrap(theBytes); 

ByteBuffer destByteBuffer = ByteBuffer.allocate(theBytes.length); 
destByteBuffer.order(ByteOrder.LITTLE_ENDIAN); 
IntBuffer destBuffer = destByteBuffer.asIntBuffer(); 

while (byteBuffer.hasRemaining()) 
{ 
    int element = byteBuffer.getInt(); 

    destBuffer.put(element); 

    /* Could write destBuffer int-by-int here, or outside this loop */ 
} 

Nie może być bardziej skuteczne sposoby, aby to zrobić, ale dla mojego szczególnego problemu musiałem zastosować matematyczną transformację do elementów, gdy kopiowałem je do nowego bufora. Powinno to jednak zadziałać w przypadku konkretnego problemu.

Powiązane problemy