Esiste un oneliner che converte un file binario da little endian a big endian?


14

e viceversa.

Sto eseguendo un RedHat se pertinente.


6
Che tipo di file binario?
Stéphane Chazelas,

1
In ogni caso, per qualsiasi formato di file, sono sicuro che potresti scrivere una riga per convertire la sua endianness usando Perl e pack / unpack . Per alcuni formati, sarà solo una linea più lunga rispetto ad altri. ;-)
Ilmari Karonen,

Risposte:


34

Non puoi farlo perché per una tale conversione, devi conoscere il significato del contenuto binario.

Se ad esempio c'è una stringa all'interno di un file binario, non deve essere convertita e un intero di 4 byte potrebbe richiedere un trattamento diverso rispetto a un intero di due byte.

In altre parole, per una conversione dell'ordine byte, è necessaria una descrizione del tipo di dati.


7
Volevo solo dirlo. non è così semplice come scambiare ogni coppia di byte. ad esempio un numero intero a 4 byte 01 02 03 04 in bigendian potrebbe apparire così in little endian 04 02 03 01 NOT 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob

1
D'accordo, l'endianness non ha senso su un flusso di byte grezzo e senza tipo ... questa dovrebbe essere la risposta accettata se OP non modifica la sua domanda
Thomas,

[citazione necessaria] - AFAIK, a meno che un'applicazione non mantenga esplicitamente un certo ordine di byte e non altri, è normale che i byte o le parole siano sempre ordinati.
In pausa fino a ulteriore avviso.

1
@DennisWilliamson: una stringa UTF-8 o ASCII non ha endianness. UTF-8 specifica l'ordine dei byte mentre ASCII è 7 bit e non ha token multi-byte. Una stringa UTF-16 ha endianness e può avere o meno una DBA per contrassegnare tale endianness. Un binario Unix che intende interagire con Windows o Java potrebbe avere entrambi i tipi di stringa, il che significa che è necessario distinguerli durante la conversione.
Kevin,

Sono venuto qui alla ricerca di un programma in cui gli dai la descrizione e i dati e li converte. Finora non ho trovato un programma del genere, ma ciò non significa che non possa essere fatto.
Levi Morrison,

32

Puoi byteswap con dd. È sufficiente? In caso contrario, aggiorna la tua domanda per dare un esempio di un file di input e del file previsto.

echo hello >infile
dd conv=swab <infile >outfile

hex infile
   0000 68 65 6c 6c 6f 0a                                 hello.
hex outfile
   0000 65 68 6c 6c 0a 6f                                 ehll.o

2

Se non ti interessa il contenuto dei file e desideri scambiare byte, prova endconv . È solo un wrapper per le funzioni di conversione di byte standard, quindi supporta la conversione di numeri interi lunghi 2, 4 e 8 byte. Non è un liner però perché è un programma separato.


0

Per modificare l'endianità del file, assumendo la dimensione della parola (32 bit), questo 1 liner dovrebbe funzionare per te:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.