web-dev-qa-db-ja.com

バイナリモードをテキストモードに変換し、逆のオプション

次の方法で、単純なバイナリファイルをテキストファイルに変換します

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

これは次のようなコンテンツを提供します:

 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
 [...]

Check.txtを元のファイルとしてCheck.tarに変換する反対の方法は何ですか

7
maihabunash
od -An -vtx1 Check.tar > Check.txt

-vまたはodは、同一のバイトのシーケンスを圧縮する必要があります。

逆の場合:

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

または:

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

ASCIIテキストのみをサポートするチャネルを介してファイルを転送することが目的である場合、uuencodeのような専用のツールがあります。

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

そして、反対側でそれらのファイルを回復するには:

uudecode < file.uu

myfiles.tar.xzを再作成します。

または:

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

ファイルを抽出します。

9

このXY問題のXの部分に答えて、バイナリファイル転送が適切に転送されない理由を調査することをお勧めします。

理由が判明した場合は、8ビットのクリーンなデータパスがないため、base64またはuuencodeなど、この状況を処理するために作成された既存のツールを使用できます。古いが、それでも非常に効果的。

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 -

または

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 -
4
roaima

私の場合、リモートデバイスにxxdまたはuudecodeはありませんでしたが、bashはありました。私は次のようになりました:

バイナリからテキストへの変換:

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

次に、txtからバイナリに変換します。

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
2
Jeremy