二重値テキストデータをバイナリ(ビット表現)に変換する方法

二重値テキストデータをバイナリ(ビット表現)に変換する方法

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)に最も興味があります。また、逆の場合:原稿を元に戻す方法は?xxdodtrprintfbc

ベストアンサー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シーケンスの途中で受信することは致命的な問題ではありません)。

おすすめ記事