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

シモンズ:私はbashを使っています

PS2:私は間違ったバイナリを手に入れなかったことを願います

24
これを理解するための最良の方法は、すべてがバイナリであるということです。あなたがやろうとしているのは、元のASCIIコード付きメッセージの2進数を表す2進数のASCIIストリングを生成することです。したがって、オリジナルがASCIIコード化されていることは無関係です(それがほぼそうである限り)。これで、バイナリをテキストとして印刷できるツールが必要になりました。 (どのようにあなたに言うための答えがすでにあります)。
追加された 著者 Mike,
最終的にこれでやりたいことを投稿できますか。私たちが提供するどんな解決策も狭いユースケースのためだけにうまくいくだろう、そして私はあなたがもっと複​​雑な方法で使いたいものを求めているのではないかという感覚を得ます。そのシナリオでは。
追加された 著者 Patrick Szalapski,
私はあなたが echo によって出力されたLF文字を無視したいと思います。
追加された 著者 Stéphane Chazelas,
@ slm完了、質問を編集しました
追加された 著者 Veronica Tash,

6 答え

$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expression evaluate the given expression as perl code
  • -p: sed mode. The expression is evaluated for each line of input, with the content of the line stored in the $_ variable and printed after the evaluation of the expression.
  • -l: even more like sed: instead of the full line, only the content of the line (that is, without the line delimiter) is in $_ (and a newline is added back on output). So perl -lpe code works like sed code except that it's perl code as opposed to sed code.
  • unpack "B*" works on the $_ variable by default and extracts its content as a bit string walking from the highest bit of the first byte to the lowest bit of the last byte.
  • pack does the reverse of unpack. See perldoc -f pack for details.

スペースあり

$ echo AB | perl -lpe '$_=join " ", unpack"(B8)*"'
01000001 01000010
$ echo 01000001 01000010 | perl -lape '$_=pack"(B8)*",@F'
AB

(入力が8ビット(0が埋め込まれた)ブロックであると仮定します)。

unpack "(B8)*" では、一度に8ビットを抽出し、結果として得られる文字列を join "" でスペースで結合します。

30
追加された
どうもありがとう。私はややperlに精通していますが、拡張された詳細は完全にperlに不慣れな人たちにとって非常に役に立つでしょう。
追加された 著者 Yokai,

ASCIIとバイナリから変換するには xxd を使います。

$ echo -n "A" | xxd -b
0000000: 01000001                                               A

$ echo -n "A" | xxd -b | awk '{print $2}'
01000001

変換基数

If you're looking to do just base conversions between Hex, Octal, & Dec I usually use the binary calculator command line tool (bc) to do such things. Note that bc is always very picky about the correct order of bases: you have to specify the resulting base (obase) first, then add your choice of ibase.

$ echo "obase=2; ibase=16; A" | bc
1010

$ echo "obase=16; ibase=2; 1010" | bc
A
20
追加された
@ RSFalcon7 - それを取り除くためにそれを awk にパイプで渡すことはできますが、この表示を無効にするスイッチはないようです<コード> awk '{print $ 2}' 他のツールもあります。 od hexdump 私はそれらを使った別の方法を探しています。
追加された 著者 Patrick Szalapski,
私は自分自身で xxd -b アプローチを使用しますが、バイナリをASCIIに戻すために xxd を単独で使用することはできません。そのため、 printf 'obase = 16; ibase = 2;%s \ n' "$ n"のようなものを使用する必要があると思います。 bc | xxd -p -r 。$ nには、変換する数値が長い数字列、またはセミコロンで区切られた数字列として含まれます。 $ nがあなたのシェルの算術型に収まることを保証できるのなら、 printf '%x \ n' $((2#$ n))|を使用することで解決できます。 xxd -p -r
追加された 著者 james2m,
perl/pythonのようなものが使えるのでなければ
追加された 著者 james2m,
@Pureferret残念ながら、 -p はバイナリ出力では動作しません
追加された 著者 james2m,
@ RSFalcon7は -p オプションを使用して「純粋な」出力を取得します
追加された 著者 Kassym Dorsel,
xxd は、最初の迷惑な列と行末の基本入力を示している点を除けば、すばらしいでしょう。
追加された 著者 Veronica Tash,

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
6
追加された

バイナリをASCIIに変換するシェルソリューション:

bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }
3
追加された
これは純粋なシェルソリューションではありません。 sed tr 、および bc は、シェルスクリプトで呼び出される外部プログラムです。
追加された 著者 Yokai,

Pythonの場合

For ASCII characters in the range [ -~] on Python 2:

>>> import binascii
>>> bin(int(binascii.hexlify('hello'), 16))
'0b110100001100101011011000110110001101111'

In reverse:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> binascii.unhexlify('%x' % n)
'hello'

In Python 3.2+:

>>> bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'

In reverse:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> n.to_bytes((n.bit_length() + 7)//8, 'big').decode()
'hello'
2
追加された

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] == "-b" or sys.argv[1] == "--binary":
            n = int(sys.argv[2].replace(' ', ''), 2)
            print(n.to_bytes((n.bit_length() + 7)//8, 'big').decode())
        if sys.argv[1] == "-a" or sys.argv[1] == "--ascii":
            print((bin(int.from_bytes(sys.argv[2].encode(), 'big')))[2:])

たとえば "bin2ascii"として保存されます。

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!
1
追加された