如何将二值文本数据转换为二进制(位表示)

hen*_*ber 5 linux command-line dd text-processing binary

我有一个文本文件,two (2)只有可能的字符(可能还有新行\n)。例子:

ABBBAAAABBBBBABBABBBABBB
Run Code Online (Sandbox Code Playgroud)

(尺寸24 bytes)

如何将其转换为二进制文件,表示位表示,将两个可能值中的每一个分配给0or 1

生成的二进制文件 ( 0=A, 1=B):

011100001111101101110111     # 24 bits - not 24 ASCII characters
Run Code Online (Sandbox Code Playgroud)

生成的十六进制文件:

70FB77                       # 3 bytes - not 6 ASCII characters
Run Code Online (Sandbox Code Playgroud)

我最感兴趣的是命令行解决方案(也许dd, xxd, od, tr, printf, bc)。另外,关于反面:如何取回原件?

lcd*_*047 5

另一个perl:

perl -pe 'BEGIN { binmode \*STDOUT } chomp; tr/AB/\0\1/; $_ = pack "B*", $_'
Run Code Online (Sandbox Code Playgroud)

证明:

$ echo ABBBAAAABBBBBABBABBBABBB | \
    perl -pe 'BEGIN { binmode \*STDOUT } chomp; tr/AB/\0\1/; $_ = pack "B*", $_' | \
    od -tx1
0000000 70 fb 77
0000003
Run Code Online (Sandbox Code Playgroud)

以上读取输入一次一行。由您来确保线条完全符合它们的预期。

编辑:反向操作:

perl -pe 'BEGIN { binmode \*STDOUT } chomp; tr/AB/\0\1/; $_ = pack "B*", $_'
Run Code Online (Sandbox Code Playgroud)

这一次读取一个字节的输入。

编辑2:更简单的反向操作:

perl -pe 'BEGIN { $/ = \3; $\ = "\n"; binmode \*STDIN } $_ = unpack "B*"; tr/01/AB/'
Run Code Online (Sandbox Code Playgroud)

以上一次从STDIN(但EOF在一个序列的中间接收不是一个致命的问题)读取3个字节。

  • @henfiber 我添加了一个执行反向操作的脚本。就像我说的,它不是单线。 (2认同)