ASCIIからバイナリへ、バイナリからASCIIへの変換ツール?

ASCIIからバイナリへ、バイナリからASCIIへの変換ツール?

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コードとして評価します。
  • -psedモデル。これ表現する入力の各行が評価され、行の内容が変数に保存され、$_評価後に印刷されます。表現する
  • -l:またはsed:全行の代わりにコンテンツ(つまり、行区切り文字はありません)$_(そして改行文字が出力に追加されます)したがって、コードの代わりにコードであることを除いて同じperl -lpe codeように機能します。sed codeperlsed
  • unpack "B*"デフォルトでは$_変数は処理され、その内容は最初のバイトの最も高いビットから最後のバイトの最も低いビットまでビット文字列として抽出されます。
  • packその逆にしてくださいunpackperldoc -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; }

関連情報