two (2)
可能な文字(および新しい行)のみを含むテキストファイルがあります\n
。例:
ABBBAAAABBBBBABBABBBABBB
(サイズ24 bytes
)
これをどのようにバイナリ、つまりビット表現に変換し、2つの可能な値をそれぞれまたは0
に割り当てますか1
?
生成されたバイナリファイル(0=A
、、1=B
):
011100001111101101110111 # 24 bits - not 24 ASCII characters
16進結果ファイル:
70FB77 # 3 bytes - not 6 ASCII characters
私はコマンドラインソリューション(たぶん、、、、、、、、、dd
)に最も興味があります。また、逆の場合:原稿を元に戻す方法は?xxd
od
tr
printf
bc
ベストアンサー1
もう一つのパール:
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
上記は、一度に1行ずつ入力を読みます。線が意図したとおりに正確に表示されることを確認するのはユーザーの役割です。
編集する:逆演算:
#!/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 );
今回は一度に1つの入力バイトを読み込みます。
編集2:より簡単なリバース操作:
perl -pe 'BEGIN { $/ = \3; $\ = "\n"; binmode \*STDIN } $_ = unpack "B*"; tr/01/AB/'
上記は一度に3バイトを読みますSTDIN
(ただし、EOF
シーケンスの途中で受信することは致命的な問題ではありません)。