2013-01-24 13 views
5

Attualmente ho un ByteBuffer Java che ha già i dati in formato Big Endian. Quindi voglio scrivere su un file binario come Little Endian.Come scrivere big endian ByteBuffer su little endian in Java

Ecco il codice che scrive solo il file ancora in 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(); 
     } 
    } 

} 

Nota che byteBuff è un ByteBuffer che è stato riempito in formato Big Endian.

La mia ultima risorsa è un metodo di forza bruta per creare un altro buffer e impostare ByteBuffer su little endian e quindi leggere i valori "getInt" dal buffer originale (big endian) e "setInt" il valore per il little endian buffer. Immagino che ci sia un modo migliore ...

+1

Avete provato i comuni Apache (http://commons.apache.org/io/api-release/org/apache/commons/io/EndianUtils.html) per quello? –

+0

+1 per Apache Commons: non reinventare la ruota :) – BachT

risposta

4

Endianess non ha significato per un byte []. L'endianità conta solo per tipi di dati multi-byte come short, int, long, float o double. Il momento giusto per ottenere l'endianess giusto è quando si scrivono i dati grezzi nei byte e si legge il formato attuale.

Se si dispone di un byte [], è necessario decodificare i tipi di dati originali e ricodificarli con il diverso endianness. Sono sicuro che concorderai che questo è un) non facile da fare o ideale b) non può essere fatto automaticamente.

3

Ecco come ho risolto un problema simile, che vogliono ottenere il "endianness" dei numeri interi sto scrivendo un file di output corretto:

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 */ 
} 

Ci potrebbero essere modi più efficaci per fare questo, ma per il mio problema particolare, ho dovuto applicare una trasformazione matematica agli elementi mentre li copiavo nel nuovo buffer. Ma questo dovrebbe ancora funzionare per il tuo problema particolare.

Problemi correlati