将二进制模式转换为文本模式以及相反的选项

将二进制模式转换为文本模式以及相反的选项

我将一个简单的二进制文件转换为文本文件:

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 作为原始文件?

答案1

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

您需要-vod将压缩相同字节的序列。

反之亦然:

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 -

提取文件。

答案2

回答此 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 -

答案3

就我而言,我的远程设备上没有 xxd 或 uudecode,但我有 bash。我最终得到以下结果:

从二进制转换为 txt:

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

相关内容