hen*_*ber 5 linux command-line dd text-processing binary
我有一个文本文件,two (2)
只有可能的字符(可能还有新行\n
)。例子:
ABBBAAAABBBBBABBABBBABBB
Run Code Online (Sandbox Code Playgroud)
(尺寸24 bytes
)
如何将其转换为二进制文件,表示位表示,将两个可能值中的每一个分配给0
or 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
)。另外,关于反面:如何取回原件?
另一个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个字节。