ASCIIをバイナリに、バイナリをASCIIに変換できるツールは何ですか?
私は次のようなものが欲しい:
$ echo --binary "This is a binary message"
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
またはより現実的には次のようになります。
$ echo "This is a binary message" | ascii2bin
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
逆の状況もあります。
$ echo "01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101" | bin2ascii
This is a binary message
PS:私はbashを使っています
PS2:間違ったバイナリを取得しないことを願っています。
答え1
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
-e expression
与えられた式をperl
コードとして評価します。-p
:sed
モデル。これ表現する入力の各行が評価され、行の内容が変数に保存され、$_
評価後に印刷されます。表現する。-l
:またはsed
:全行の代わりにコンテンツ(つまり、行区切り文字はありません)$_
(そして改行文字が出力に追加されます)したがって、コードの代わりにコードであることを除いて同じperl -lpe code
ように機能します。sed code
perl
sed
unpack "B*"
デフォルトでは$_
変数は処理され、その内容は最初のバイトの最も高いビットから最後のバイトの最も低いビットまでビット文字列として抽出されます。pack
その逆にしてくださいunpack
。perldoc -f pack
詳細より。
スペースを含む:
$ echo AB | perl -lpe '$_=join " ", unpack"(B8)*"'
01000001 01000010
$ echo 01000001 01000010 | perl -lape '$_=pack"(B8)*",@F'
AB
(入力が8ビットブロック(0パディング)であるとします。)
を使用してunpack "(B8)*"
一度に8ビットを抽出し、結果の文字列をスペースで連結しますjoin " "
。
答え2
xxd
変換にはASCIIとバイナリを使用できます。
$ echo -n "A" | xxd -b
0000000: 01000001 A
$ echo -n "A" | xxd -b | awk '{print $2}'
01000001
スイッチベース
16進数、8進数、10進数の基本的な変換のみを実行するには、通常、デフォルトの電卓コマンドラインツール(bc
)を使用します。bc
塩基の正しい順序は常に厳しいことに注意してください。obase
まず、結果の塩基()を指定する必要があります。それから選択肢を追加してくださいibase
。
$ echo "obase=2; ibase=16; A" | bc
1010
$ echo "obase=16; ibase=2; 1010" | bc
A
答え3
bcとbashの使用:
#!/bin/bash
chrbin() {
echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}
ordbin() {
a=$(printf '%d' "'$1")
b=$(echo "obase=2; $a" | bc)
printf '%08d' $b
}
ascii2bin() {
echo -n $* | while IFS= read -r -n1 char
do
ordbin $char | tr -d '\n'
echo -n " "
done
}
bin2ascii() {
for bin in $*
do
chrbin $bin | tr -d '\n'
done
}
ascii2bin "This is a binary message"
bin2ascii 01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
答え4
バイナリをASCIIに変換するためのシェルソリューション:
bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }