Ich habe eine Herausforderung gelöst, bei der ich eine Datendatei ohne Dateierweiterung gefunden habe. Der file
Befehl zeigt, dass es sich um eine handelt data file (application/octet-stream)
. Der hd
Befehl zeigt BSP. in der letzten Zeile. Wenn ich diese Datei umkehre , erhalte ich die Datei im PNG- Format. Ich habe überall gesucht, aber keine Lösung gefunden, die erklärt, wie der Inhalt einer Binärdatei umgekehrt werden kann.
11
In
zsh
(die einzige Shell, die intern mit Binärdaten umgehen kann (es sei denn, Sie möchten den Base64-Codierungsansatz von ksh93 in Betracht ziehen )):LC_ALL=C
: Zeichen sind Bytes$mapfile[file.gnp]
: Inhalt derfile.gnp
Dateis::
: Teilen Sie den String in seine Byte-Bestandteile aufOa
: ReverseO
Rder aufa
Rray-Index dieses Arraysquelle
zsh
ist nicht die einzige Shell, die Binärdaten verarbeiten kann.Hier ist eine Möglichkeit, eine Binärdatei mit umzukehren
ksh93
. Ich habe den Code "lose" gelassen, um das Verständnis zu erleichtern.quelle
read
oben nichts lesen sollte, da dies am Ende der Datei erfolgt.strace
undksh93
scheint sehr seltsam zu verhalten, wo es überall in der Datei sucht und liest zur Zeit große Mengen. Vielleicht eine Variante von github.com/att/ast/issues/15strace
das Skript aus, um zu sehen, was ich meine.ksh93
liest die Dateien tausende Male. Beispielsweise sucht es vor dem Lesen des ersten Bytes 64 KB am Ende der Datei, liest 64 KB, sucht dann vor dem letzten Byte und liest 1 Byte und führt für jedes Byte etwas Ähnliches aus. Beachten Sie, dass das, was Sie mit diesen Base64-codierten Zeichenfolgen tun können, begrenzt ist. Wenn Sie also mehr als ein Byte gleichzeitig lesen, wird es schwieriger, die einzelnen Bytes davon zu extrahieren.Ich habe folgendes versucht:
Die Idee ist, 'tac' mit einem beliebigen Zeichen als Trennzeichen zu erzwingen. Ich habe das mit einer Binärdatei versucht und es schien zu funktionieren, aber jede Bestätigung wäre willkommen.
Hauptvorteil ist, dass keine Datei in den Speicher geladen wird.
quelle
tac
8.28), wenn die Eingabe Zeilenumbrüche enthält.printf '1\n2' | tac -rs . | od -vAn -tc
Ausgänge\n 2 1
statt2 \n 1
. Sie würden auch Multi-Byte-Zeichen benötigenLC_ALL=C
oder.
könnten übereinstimmen.LC_ALL=C tac -rs $'.\\|\n'
scheint aber zu funktionieren.Mit Perl:
Leistungstest:
Ergebnis:
perl -0777 -F
die langsamste.xxd
ist die langsamste.Hinweis: Die
diff
Zeitabläufe sollten für alle Lösungen gleich sein, da die Ausgabe gleich sein sollte.quelle
perl
. Ich hatte damals noch nicht bemerktreverse
, dass man auch Strings umkehren kann, daher machte das Aufteilen keinen Sinn und Ihre Version ist viel besser.