Konvertieren Sie den Binärmodus in den Textmodus und die umgekehrte Option

7

Auf folgende Weise konvertiere ich eine einfache Binärdatei in eine Textdatei

od –t x1 Check.tar | cut –c8- > Check.txt

Welches gibt einen Inhalt ähnlich wie:

 64 65 76 2f 6e 75 6c 6c 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 [...]

Was ist der umgekehrte Weg, um die Check.txt in Check.tar als Originaldatei zu konvertieren

maihabunash
quelle
1
Vielleichtxxd -r -p Check.txt > Check.tar
cuonglm
seine noch Textdatei, ist nicht Arbeit
Maihabunash
Was lässt Sie glauben, dass es sich immer noch um eine Textdatei handelt? xxd -r -pist die genaue Umkehrung der von odIhnen vorgenommenen Konvertierung; Die Ausgabe des Befehls von cuonglm sollte streng mit dem ursprünglichen Tarball identisch sein.
Stephen Kitt
xxd -r -p Check.txt> Check.tar ..... Datei Check.tar Check.tar: ASCII Text
Maihabunash
Ich versuche auch dies - tar xvf Check.tar tar: Verzeichnisprüfsummenfehler
maihabunash

Antworten:

9
od -An -vtx1 Check.tar > Check.txt

Sie benötigen -voder odwerden Sequenzen identischer Bytes komprimieren.

Für das Gegenteil:

LC_ALL=C tr -cd 0-9a-fA-F < Check.txt | xxd -r -p > Check.tar

Oder:

perl -ape '$_=pack "(H2)*", @F' Check.txt > Check.tar

Wenn Sie Dateien über einen Kanal übertragen möchten, der nur ASCII-Text unterstützt, gibt es dafür spezielle Tools wie uuencode:

tar cf - myfiles.* | xz | uuencode myfiles.tar.xz | that-channel 

Und um diese Dateien am anderen Ende wiederherzustellen:

uudecode < file.uu

würde neu erstellen myfiles.tar.xz.

Oder:

uudecode -o - < file.uu | xz -d | tar xf -

So extrahieren Sie die Dateien.

Stéphane Chazelas
quelle
zuerst danke für die antwort, aber ich muss file.tar datei erstellen, wie geht das?
Maihabunash
@maihabunash Wenn Sie file.txt ohne -v und mit Entfernen der Adresse erstellt haben, können Sie file.tar nicht zuverlässig wiederherstellen, wenn komprimierte Sequenzen vorhanden sind ( grep '[*]' file.txtüberprüfen Sie dies), da Sie die Informationen darüber verloren haben, wie lange diese komprimiert wurden Sequenzen wurden durch Entfernen der Adresse.
Stéphane Chazelas
Hallo, mein Ziel ist es, mehr als 30 Perl-Skripte mit tar oder zip oder was auch immer zu komprimieren und es dann in Text und dann wieder in eine komprimierte Datei zu konvertieren. Ist das möglich? (Ich sehe, Teer ist ein Problem, aber können wir es mit anderen Optionen tun)
Maihabunash
oder vielleicht gibt es mehr Möglichkeiten zum Beispiel, um die 30 Skripte zu komprimieren, aber als ASCII- oder Textmodus brauche ich das, denn wenn ich aus unklaren Gründen von einem Computer auf einen anderen Computer kopiere, sind die Binärdateien Änderungen (chksum) und keine ASCII-Dateien
maihabunash
1
@maihabunash, Sie suchen nach Uuencode oder Base64-Codierung. Beachten Sie, dass meine Antwort Ihre Frage abdeckt. Ich gebe den Code zum Konvertieren von Binärdaten von der OD-Ausgabe zurück, vorausgesetzt, Sie vergessen die -vOption nicht. Wenn Sie Dateien über FTP übertragen, vergessen Sie nicht, den Modus auf "binär" zu setzen ( TYPE IFTP-Befehl, so etwas wie binaryin Ihrem Client)
Stéphane Chazelas
4

Um den X-Teil dieses XY-Problems zu beantworten, würde ich Ihnen empfehlen, den Grund zu untersuchen, warum Ihre Binärdateiübertragungen nicht richtig übertragen werden.

Wenn sich herausstellt, dass der Grund dafür ist, dass Sie keinen sauberen 8-Bit-Datenpfad haben, können Sie vorhandene Tools verwenden, die für diese Situation erstellt wurden, z. B. base64oder sogar uuencode. Alt aber immer noch sehr effektiv.

tar czvf - /etc/h* | base64 >/tmp/tar.tgz.b64
ls -l /tmp/tar.tgz.b64
-rw-r--r-- 1 root root 7364 May 26 11:52 /tmp/tar.tgz.b64
...
base64 -d /tmp/tar.tgz.b64 | tar tzvf -

oder

tar czvf - /etc/h* | uuencode - >/tmp/tar.tgz.uue
ls -l /tmp/tar.tgz.uue
-rw-r--r-- 1 root root 7530 May 26 11:51 /tmp/tar.tgz.uue
...
uudecode /tmp/tar.tgz.uue | tar xzvf -
Roaima
quelle
Upvote +1 für Sie thx
maihabunash
+1 für den Vorschlag von base64, was bei meiner relativ frischen Cygwin-Installation funktioniert.
mwfearnley
2

In meinem Fall hatte ich weder xxd noch uudecode auf dem Remote-Gerät, aber ich hatte Bash. Am Ende hatte ich Folgendes:

Konvertieren Sie von binär nach txt mit:

od -An -vtx1 myfile.bin > myfile.txt

Dann konvertiere zurück von txt zu binär mit:

while read p; do
    IFS=' ' read -r -a array <<< "$p" 
    for index in "${!array[@]}" 
    do
        echo -en "\x${array[index]}" 
    done
done < myfile.txt > myfile.bin
Jeremy
quelle