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


31

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:間違ったバイナリを取得しなかったことを願っています


最終的にこれでやりたいことを投稿できますか?私たちが提供するソリューションはいずれも、狭いユースケースでのみ機能する可能性が高く、より複雑な方法で使用したいものを求めているという感覚があり、提供されたソリューションは失敗する可能性がありますそのシナリオで。
slm

@slm完了、質問を編集
-RSFalcon7

によるLF文字出力を無視したいと思いますecho
ステファンシャゼル

これを理解する最良の方法は、すべてがバイナリであることです。あなたがしようとしているのは、元のASCIIコード化されたメッセージのバイナリを表すバイナリ数字のASCII文字列を生成することです。したがって、オリジナルがASCIIコード化されていることは関係ありません(ほとんどの場合、そうである限り)。これで、バイナリをテキストとして印刷できるツールが必要になります。(方法を説明するための回答は既にあります)。
ctrl-alt-delor

回答:


36
$ 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の逆を行い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 " "


どうもありがとう。私はperlにある程度精通していますが、拡張された詳細は、perlをまったく知らない人にとって非常に役立ちます。
妖怪

23

xxdASCIIおよびバイナリからの変換に使用できます。

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

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

塩基の変換

16進数、8進数、および12進数間の基本変換のみを実行する場合は、通常、基本的な計算コマンドラインツール(bc)を使用してこのようなことを行います。注bc常に拠点の正しい順序について非常にうるさいです:あなたは結果のベースを(指定する必要がobase)最初に、その後のあなたの選択を追加しますibase

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

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

xxd最初の迷惑な列と行末の基本入力を示すことを除いて、素晴らしいでしょう。
RSFalcon7

@ RSFalcon7-私は知っています、あなたはそれをawk取り除くためにそれをパイプすることができますが、この表示を無効にするスイッチを持っていないようです。| awk '{print $2}'。他のツールもあります。odhexdump。私はそれらを使用して別の方法を探しています。
slm

1
@ RSFalcon7使う-p「純粋な」出力を取得するオプションを
Pureferret

私はxxd -b自分でアプローチを使用しますが、xxdバイナリをASCIIに変換するために単独で使用することはできません。そのため、printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r長い数字列またはセミコロンで区切られた数字列のいずれかとして、変換する数値を$ nに含めて、のようなものを使用する必要があるのではないかと心配しています。あなたは、シェルの算術型にその$ Nフィットを保証することができるなら、あなたが逃げることprintf '%x\n' $((2#$n)) | xxd -p -r
Franki

あなたはperlの/ Pythonのようなものを使用することができない限り
Franki

8

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

5

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

bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }

2
これは純粋なシェルソリューションではありません。sedtr、およびbcシェルスクリプトで呼び出される外部プログラムです。
妖怪

4

Pythonで

[ -~]Python 2 の範囲内のASCII文字の場合:

>>> 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'

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] 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!

0

base64によるバイナリのエンコード

$ echo "This is a binary message" | base64
VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==

base64のデコード

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.