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.
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.
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.
Antworten:
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.
quelle
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.quelle
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
Um die Endianess der Datei zu ändern, sollte dieser 1 Liner bei einer angenommenen Wortgröße (32 Bit) für Sie funktionieren:
quelle