Gibt es einen Oneliner, der eine Binärdatei von Little Endian nach Big Endian konvertiert?

14

und umgekehrt.

Ich betreibe einen RedHat, falls relevant.

Fermats Schüler
quelle
6
Welche Art von Binärdatei?
Stéphane Chazelas
1
Auf jeden Fall können Sie für jedes Dateiformat einen Einzeiler schreiben, um seine Endianness mit Perl zu konvertieren und zu packen / entpacken . Bei einigen Formaten ist die Zeile nur länger als bei anderen. ;-)
Ilmari Karonen

Antworten:

34

Dies ist nicht möglich, da Sie für eine solche Konvertierung die Bedeutung des binären Inhalts kennen müssen.

Befindet sich beispielsweise eine Zeichenfolge in einer Binärdatei, darf diese nicht konvertiert werden, und eine 4-Byte-Ganzzahl muss möglicherweise anders behandelt werden als eine 2-Byte-Ganzzahl.

Mit anderen Worten, für eine Konvertierung der Bytereihenfolge benötigen Sie eine Datentypbeschreibung.

schily
quelle
7
Ich wollte das nur sagen. Es ist nicht so einfach, nur jedes Bytepaar zu tauschen. zum Beispiel ein 4 - Byte - Ganzzahl 01 02 03 04 in bigEndian könnte wie folgt aussehen in Little - Endian 04 02 03 01 NICHT 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob
1
Einverstanden, Endianness macht in einem rohen, typenlosen Byte-Stream keinen Sinn ... Dies sollte die akzeptierte Antwort sein, wenn OP seine Frage nicht bearbeitet
Thomas
[Zitieren erforderlich] - AFAIK: Wenn in einer Anwendung nicht explizit eine bestimmte Byte-Reihenfolge und keine andere Reihenfolge beibehalten wird, ist es üblich, dass Bytes oder Wörter durchgehend gleich geordnet sind.
Bis auf weiteres angehalten.
1
@DennisWilliamson: Eine UTF-8- oder ASCII-Zeichenfolge hat keine Endianness. UTF-8 gibt die Bytereihenfolge an, während ASCII 7-Bit ist und keine Multi-Byte-Token enthält. Eine UTF-16-Zeichenfolge hat Endianess und kann eine Stückliste enthalten, um diese Endianess zu kennzeichnen. Eine Unix-Binärdatei, die mit Windows oder Java interagieren soll, verfügt möglicherweise über beide Arten von Zeichenfolgen. Dies bedeutet, dass Sie diese bei der Konvertierung unterscheiden müssen.
Kevin
Ich bin auf der Suche nach einem Programm hierher gekommen, in dem Sie ihm die Datenbeschreibung und die Daten geben und sie konvertieren. Bisher habe ich ein solches Programm nicht gefunden, aber das heißt nicht, dass es nicht möglich ist.
Levi Morrison
32

Sie können mit byteswap dd. Ist das ausreichend? Wenn nicht, aktualisieren Sie Ihre Frage, um ein Beispiel für eine Eingabedatei und die erwartete Ausgabedatei anzugeben.

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
Roaima
quelle
2

Wenn Sie sich nicht für Dateiinhalte interessieren und nur Bytes austauschen möchten, versuchen Sie es mit endconv . Es handelt sich lediglich um einen Wrapper für Standard-Byte-Konvertierungsfunktionen, sodass die Konvertierung durch Ganzzahlen mit einer Länge von 2, 4 und 8 Byte unterstützt wird. Es ist jedoch kein einziger Liner, da es sich um ein separates Programm handelt.


quelle
0

Um die Endianess der Datei zu ändern, sollte dieser 1 Liner bei einer angenommenen Wortgröße (32 Bit) für Sie funktionieren:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
hesham_EE
quelle