Ist es möglich, xxd umzukehren, um die Originaldatei aus der Binärdatei zu erhalten

5719
arvindh

Ich habe verwendet xxd, um eine Hexadarstellung einer Datei zu erstellen (jede Datei wie .jpg, .docx, .zip usw.), wie folgt, ..

$ xxd -p original_file.zip > hexa_format.txt 

und umzukehren

$ xxd -r -p hexa_format.txt > original_file.zip 

Wenn jemand der Meinung ist, dass dies nicht der richtige Weg ist, korrigieren Sie mich bitte. Jedenfalls ist das nicht meine Frage. jetzt muss ich sie in binär statt hexa konvertieren. also geht der Befehl so, wenn ich richtig bin.

$ xxd -p -b original_file.zip > binary_format.txt 

Meine Frage ist,
wie ich es aus der Binärdatei (binary_format.txt), die mit dem obigen Befehl erstellt wurde, auf die Originaldatei zurücksetzt. Die Manpage von xxd sagt, dass dies nicht möglich ist (in der letzten Zeile).

-b | -bits Switch to bits (binary digits) dump, rather than hexdump. This option writes octets as eight digits "1"s and "0"s instead of a normal hexadecimal dump. Each line is preceded by a line number in hexadecimal and followed by an ascii (or ebcdic) representa‐ tion. The command line switches -r, -p, -i do not work with this mode. 

Wenn dies nicht möglich ist, gibt es keinen anderen Befehl, der es kann. wie das Pfeifen mehrerer Kommandos so.

2
`xxd` gibt keine Binärdateien aus. Es gibt Textdarstellungen von Dateien aus. Bitte lesen Sie die Handbuchseite. Das oben erwähnte binäre Format besteht nur aus den Bytes der Datei, die als 1 und 0 geschrieben werden. Allen vor 9 Jahren 0

2 Antworten auf die Frage

0
Romeo Ninov

Sie ändern die Struktur der Datei, wenn Sie dies nicht einfach tun können. Vielleicht kann so etwas helfen (aber Sie verlieren die Zeilenumbrüche:

awk '' binary_format.txt >out_file 
terminal durchbricht dies: awk: Laufzeitfehler: Es wurden nicht genügend Argumente an printf übergeben ("...% & '"). FILENAME = "bin_jpg.txt" FNR = 59 NR = 59.` Meine Verwendung ist mehr oder weniger ähnlich Wiederherstellen der Originaldatei arvindh vor 9 Jahren 0
Versuchen Sie es auf folgende Weise auszuführen: awk '' binary_format.txt> out_file Romeo Ninov vor 9 Jahren 0
Jetzt ist der Fehler "awk: Laufzeitfehler: nicht genügend Argumente an printf ("% s ...... ") übergeben. FILENAME =" bin_jpg.txt "FNR = 1 NR = 1". arvindh vor 9 Jahren 0
'' Und aktualisieren Sie Ihre Version von awk. Ihre Version scheint sehr alt zu sein Romeo Ninov vor 9 Jahren 0
Warum interessieren Sie sich nur für das achte Feld? Allen vor 9 Jahren 0
@Allen, bitte überprüfen Sie, wie das Format (binär) aussieht. Der ursprüngliche Inhalt befindet sich in Feld 8. Der Rest besteht aus Zähler- und Binärzeichenfolgen Romeo Ninov vor 9 Jahren 0
@R. Ninov: Falsch. Das ist eine Textdarstellung, die nicht eins zu eins ist. Es verwendet einen Punkt "." Für alle Elemente, die kein druckbares ASCII-Zeichen enthalten. Allen vor 9 Jahren 0
@Allen, habe das nicht überprüft, teste einfach mit der ASCII-Datei Romeo Ninov vor 9 Jahren 0
@Allen, ich nehme an, Sie schieben zwei verschiedene Dateien in ein anderes Programm (ich weiß, dass dies lahm klingt.). Dieses Programm akzeptiert nur die binäre Darstellung / das Format einer Datei (es akzeptiert keine .jpg, .zip usw.), die als Eingabe angegeben wurden. Das ist der Grund, warum ich sie in binär konvertieren muss. Ich bin kein Experte, aber da ich auf dieses `xxd` gestoßen bin, das das binäre Format einer Datei erhalten kann, habe ich diesen Weg gewählt. arvindh vor 9 Jahren 0
In Unix ist eine Datei nur ein Stream von Bytes. Von welchem ​​Programm sprichst du? Allen vor 9 Jahren 0
xxd nimmt eine Datei im 'binären' Format und gibt eine TEXTUAL-Darstellung aus, so dass es sowieso nicht das ist, was Sie wollen. Allen vor 9 Jahren 0
@Allen, es handelt sich lediglich um einen in Python geschriebenen Code, der nicht viele Techniken zur Dateibehandlung wie Puffer oder StringIO-Module enthält (nichts großes oder eindrucksvolles Programm / Code). Wenn Sie also denken, dass dies nicht der Fall ist, haben Sie Vorschläge. arvindh vor 9 Jahren 0
0
Allen

Sie müssen Ihre eigene Binär-zu-Hex-Funktion schreiben ...

cut -f2-8 -d' ' infile | tr -d '\n' | tr ' ' '\n' | while read l;  do  echo -n $(bin_to_hex($l)) >> outfile (( ++n ))  (( n % 60 == 0)) && echo "" >> outfile  done 

Dies sollte das gleiche Format ausgeben, das -pdann durchlaufen werden kann -r. Wenn Sie die Manpage für xxdSie lesen, lesen Sie, dass es keine -rfür gibt -b. Es steht so auf dem Auszug, den Sie in Ihre Frage aufgenommen haben.

Soll ich diese Zeilen in eine Datei einfügen und sie dann als `.sh` ausführen, ..? arvindh vor 9 Jahren 0
Dadurch wird der genaue Text nicht wiederhergestellt. Fügen Sie einfach jedes 60. Symbol hinzu. Romeo Ninov vor 9 Jahren 0
Sie können es in eine Datei oder in die Befehlszeile einfügen. Dadurch wird dasselbe Format wie bei -p ausgegeben: 60 Hexadezimalwerte pro Zeile. Allen vor 9 Jahren 0
Ich verstehe, also schreibst du den Kodierer neu Romeo Ninov vor 9 Jahren 0
Terminal sagt bash: Befehlsersetzung: Zeile 18: Syntaxfehler in der Nähe des unerwarteten Tokens `$ l 'bash: Befehlsersetzung: Zeile 18:` bin_to_hex ($ l))' arvindh vor 9 Jahren 0
Sie müssen Ihre eigene Funktion `bin_to_hex ()` schreiben. Sie verstehen, dass xxd TEXTUAL-Repräsentationen von Dateien ausgibt, richtig? Allen vor 9 Jahren 0
@Allen, ja, ich habe es verstanden. und danke für die hilfe arvindh vor 9 Jahren 0