Pythonで文字列をバイナリに変換する


106

Pythonで文字列のバイナリ表現を取得する方法が必要です。例えば

st = "hello world"
toBinary(st)

これを行うきちんとした方法のモジュールはありますか?


8
具体的には、出力はどうなると思いますか?
NPE 2013

「バイナリ」とは、0101010タイプまたはord各文字の(16進など)の内数を意味しますか?
cdarke 2013

実際にバイナリ(ゼロと1)を意味すると仮定して、各文字のバイナリ表現(1文字あたり8ビット)が次々に必要ですか?たとえば、hはASCII値です104はバイナリでは
01101000

この質問はstackoverflowの上で何度も回答されています stackoverflow.com/questions/11599226/... stackoverflow.com/questions/8553310/...を
0xcaff

回答:


124

このようなもの?

>>> st = "hello world"
>>> ' '.join(format(ord(x), 'b') for x in st)
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'

#using `bytearray`
>>> ' '.join(format(x, 'b') for x in bytearray(st, 'utf-8'))
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'

21
または、各2進数を1バイトにしたい場合: '' .join(format(ord(i)、 'b')。zfill(8)for i in st)
ChrisProsser

5
全バイトの場合は' '.join('{0:08b}'.format(ord(x), 'b') for x in st)、を使用することもできます。これは、zfill(8)ソリューションよりも約35%高速です(少なくとも私のマシンでは)。
最大

のようにβ、1バイトを超える文字を変換することについてはどう11001110 10110010ですか?
Sergey Bushmanov

1
私はこれがずっと前に投稿されたことを知っていますが、非ASCII文字についてはどうですか?
pkqxdd 2017

48

よりパイソン的な方法として、最初に文字列をバイト配列に変換し、次にbin関数を使用することができますmap

>>> st = "hello world"
>>> map(bin,bytearray(st))
['0b1101000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1110111', '0b1101111', '0b1110010', '0b1101100', '0b1100100']

または、あなたはそれに参加することができます:

>>> ' '.join(map(bin,bytearray(st)))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'

python3ではbytearrayfunctionのエンコーディングを指定する必要があることに注意してください:

>>> ' '.join(map(bin,bytearray(st,'utf8')))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'

binasciiPython 2でモジュールを使用することもできます。

>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'

hexlifyバイナリデータの16進数表現を返し、16をベースとして指定してintに変換し、を使用してバイナリに変換できbinます。


5
これはよりPythonicであるだけでなく、マルチバイトの非ASCII文字列に対して「より」正確です。
Sergey Bushmanov

(少なくとも現在のバージョンでは3.7.4):(1)bytearrayエンコーディング(文字列だけではない)を期待し、(2)オブジェクトmap(bin, ...)を返すことに注意してくださいmap。最初のポイントbobとして、@ Taoの提案に従って、たとえば.encoding( 'ascii') ` を使用します。2番目の点についてはjoin、@ Kasramvdの他の例と同様に、メソッドを使用して目的の結果を表示します。
アントワーヌ

35

エンコードするだけです。

'string'.encode('ascii')

私(v3.7.4)の場合、これはbytesオブジェクト(可能な場合は各バイトのASCII表現)を返し、そのバイナリ表現を表示するにはbin、たとえば' '.join(item[2:] for item in map(bin, 'bob'.encode('ascii')))0bバイナリ表現の先頭で削除する必要があることに注意してください)が必要です各文字の)。
Antoine

15

ord()組み込み関数を使用して、文字列内の文字のコード値にアクセスできます。その後、これをバイナリでフォーマットする必要がある場合、string.format()メソッドが機能します。

a = "test"
print(' '.join(format(ord(x), 'b') for x in a))

(そのコードスニペットを投稿してくれたAshwini Chaudharyに感謝します。)

上記のコードはPython 3で動作しますが、UTF-8以外のエンコーディングを想定している場合、この問題はさらに複雑になります。Python 2では、文字列はバイトシーケンスであり、ASCIIエンコーディングがデフォルトで想定されています。Python 3では、文字列はUnicodeであると想定されておりbytes、Python 2文字列のように機能する別の型があります。UTF-8以外のエンコーディングを想定する場合は、エンコーディングを指定する必要があります。

Python 3では、次のようなことができます。

a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))

UTF-8とasciiエンコーディングの違いは、単純な英数字の文字列では明らかではありませんが、ASCII文字セットにない文字を含むテキストを処理する場合は重要になります。


2

Pythonバージョン3.6以降では、f-stringを使用して結果をフォーマットできます。

str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
  • コロンの左側のord(i)は、値がフォーマットされて出力に挿入される実際のオブジェクトです。ord()を使用すると、単一のstr文字に対して10を基数とするコードポイントが得られます。

  • コロンの右側はフォーマット指定子です。08は幅8を意味し、0は埋め込まれ、bは符号として機能し、結果の数値を基数2(バイナリ)で出力します。


1

これは、使用された既存の回答の更新であり、bytearray()その方法ではもう機能しません。

>>> st = "hello world"
>>> map(bin, bytearray(st))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding

上記のリンクで説明したように、ソースが文字列の 場合は、エンコーディングも指定する必要があります

>>> map(bin, bytearray(st, encoding='utf-8'))
<map object at 0x7f14dfb1ff28>

0
def method_a(sample_string):
    binary = ' '.join(format(ord(x), 'b') for x in sample_string)

def method_b(sample_string):
    binary = ' '.join(map(bin,bytearray(sample_string,encoding='utf-8')))


if __name__ == '__main__':

    from timeit import timeit

    sample_string = 'Convert this ascii strong to binary.'

    print(
        timeit(f'method_a("{sample_string}")',setup='from __main__ import method_a'),
        timeit(f'method_b("{sample_string}")',setup='from __main__ import method_b')
    )

# 9.564299999998184 2.943955828988692

method_bは、すべての文字を手動で整数に変換してから、その整数をバイナリ値に変換する代わりに、低レベルの関数呼び出しを行うため、バイト配列への変換においてかなり効率的です。


-1
a = list(input("Enter a string\t: "))
def fun(a):
    c =' '.join(['0'*(8-len(bin(ord(i))[2:]))+(bin(ord(i))[2:]) for i in a])
    return c
print(fun(a))

1
この読めないコードのみの回答をいくつかの説明で補強しますか?これは、StackOverflowが無料のコード作成サービスであるという誤解を解消するのに役立ちます。読みやすさを改善したい場合は、ここに提供されている情報を試してください:stackoverflow.com/editing-help
Yunnosch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.