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:間違ったバイナリを取得していないことを願っています
$ echo AB | Perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | Perl -lpe '$_=pack"B*",$_'
AB
-e expression
は、指定された式をPerl
コードとして評価します-p
:sed
モード。 式は入力の各行に対して評価され、行の内容は$_
変数に格納され、式の評価後に出力されます。-l
:sed
に似ています:行全体ではなく、行のcontent(つまり、行区切り文字なし)のみが$_
にあります(出力に改行が追加されます)。したがって、Perl -lpe code
は、Perl
コードではなくsed
コードであることを除いて、sed code
と同様に機能します。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 " "
でスペースで結合します。
xxd
を使用して、ASCIIおよびバイナリから変換できます。
$ echo -n "A" | xxd -b
0000000: 01000001 A
$ echo -n "A" | xxd -b | awk '{print $2}'
01000001
16進数、8進数、12進数の間の基本変換のみを行う場合は、通常、基本的な計算機のコマンドラインツール(bc
)を使用してそのようなことを行います。 bc
は常に正しい塩基の順序について非常にうるさいことに注意してください。結果の塩基(obase
)を最初に指定する必要があります。thenibase
の選択肢を追加します。
$ echo "obase=2; ibase=16; A" | bc
1010
$ echo "obase=16; ibase=2; 1010" | bc
A
Bcおよびbashの使用:
#!/bin/bash
chrbin() {
echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}
ordbin() {
a=$(printf '%d' "'$1")
echo "obase=2; $a" | bc
}
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
バイナリをASCIIに変換するシェルソリューション:
bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }
ASCIIの範囲の文字
[ -~]
on Python 2:>>> import binascii >>> bin(int(binascii.hexlify('hello'), 16)) '0b110100001100101011011000110110001101111'
逆に:
>>> n = int('0b110100001100101011011000110110001101111', 2) >>> binascii.unhexlify('%x' % n) 'hello'
Python 3.2+:
>>> bin(int.from_bytes('hello'.encode(), 'big')) '0b110100001100101011011000110110001101111'
逆に:
>>> n = int('0b110100001100101011011000110110001101111', 2) >>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode() 'hello'
Python 3:
#!/usr/bin/env python3
import sys
if __name__ == "__main__":
if len(sys.argv) != 1 and len(sys.argv) <= 3:
if sys.argv[1] in ('-b', '--binary'):
n = int(sys.argv[2].replace(' ', ''), 2)
print(n.to_bytes((n.bit_length() + 7) // 8, 'big').decode())
if sys.argv[1] in ('-a', '--ascii'):
print((bin(int.from_bytes(sys.argv[2].encode(), 'big')))[2:])
else:
print("Example: decode -b '10000001'")
たとえば、「bin2ascii」として保存されます。
$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001
$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001
Hello, world!
$ echo "This is a binary message" | base64
VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==
$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message