Linux

如何將二值文本數據轉換為二進制(位表示)

  • January 29, 2021

我有一個文本文件,其中two (2)只有可能的字元(可能還有新行\n)。例子:

ABBBAAAABBBBBABBABBBABBB

(尺寸24 bytes)

如何將其轉換為二進製文件,即位表示,兩個可能值中的每一個都分配給0or 1

生成的二進製文件 ( 0=A, 1=B):

011100001111101101110111     # 24 bits - not 24 ASCII characters

生成的十六進製文件:

70FB77                       # 3 bytes - not 6 ASCII characters

我最感興趣的是命令行解決方案(也許dd, xxd, od, tr, printf, bc)。另外,關於逆:如何取回原來的?

另一個perl:

perl -pe 'BEGIN { binmode \*STDOUT } chomp; tr/AB/\0\1/; $_ = pack "B*", $_'

證明:

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

上面一次讀取一行輸入。您可以確保這些線條完全符合它們的預期。

**編輯:**反向操作:

#!/usr/bin/env perl

binmode \*STDIN;

while ( defined ( $_ = getc ) ) {
   $_ = unpack "B*";
   tr/01/AB/;
   print;
   print "\n" if ( not ++$cnt % 3 );
}
print "\n" if ( $cnt % 3 );

這一次讀取一個字節的輸入。

**編輯2:**更簡單的反向操作:

perl -pe 'BEGIN { $/ = \3; $\ = "\n"; binmode \*STDIN } $_ = unpack "B*"; tr/01/AB/'

上面一次讀取 3 個字節STDIN(但EOF在序列中間接收不是致命問題)。

引用自:https://unix.stackexchange.com/questions/212176