web-dev-qa-db-ja.com

Pythonの文字列/テキストへのバイナリ

オンラインで何度も検索したが、バイナリ文字列変数を変換する方法を見つけることができませんでした[〜#〜] x [〜#〜]

X = "1000100100010110001101000001101010110011001010100"

uTF-8文字列値に変換します。

一部の人々は次のような方法を使用していることがわかりました

b'message'.decode('utf-8')

ただし、「b」は存在しないと言われているため、この方法は機能しませんでした。「メッセージ」を変数に置き換える方法はわかりません。だけでなく、この方法がどのように機能するかを理解できませんでした。より良い代替手段はありますか?

では、バイナリ文字列をテキスト文字列に変換するにはどうすればよいですか?

編集:私も気にしませんASCIIデコード

明確化:具体的には、次のとおりです。

def binaryToText(z):
    # Some code to convert binary to text
    return (something here);
X="0110100001101001"
print binaryToText(X)

これにより、文字列が生成されます...

hi
6
Dan

各文字のバイナリ文字列表現(ビット文字列)からASCII文字をデコードしようとしているようです。

8文字(バイト)の各ブロックを取得し、それを整数に変換してから、chr()を使用して文字に変換できます。

>>> X = "0110100001101001"
>>> print(chr(int(X[:8], 2)))
h
>>> print(chr(int(X[8:], 2)))
i

文字列にエンコードされた値がASCIIであると仮定すると、これは文字を提供します。次のように一般化できます。

def decode_binary_string(s):
    return ''.join(chr(int(s[i*8:i*8+8],2)) for i in range(len(s)//8))

>>> decode_binary_string(X)
hi

元のエンコーディングで保持する場合は、さらにデコードする必要はありません。通常、着信文字列をPython nicode文字列に変換します。これは次のように実行できます(Python 2):

def decode_binary_string(s, encoding='UTF-8'):
    byte_string = ''.join(chr(int(s[i*8:i*8+8],2)) for i in range(len(s)//8))
    return byte_string.decode(encoding)
4
mhawke

変換するオプションのベース引数をintに提供します:

>> x = "1000100100010110001101000001101010110011001010100"
>> int(x, 2)
301456912901716
1
souldeux

「01」文字列(2進数)として指定されたビットを、Python 3の対応するテキストに変換するには:

>>> bits = "0110100001101001"
>>> n = int(bits, 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hi'

Python 2/3ソリューションについては、 バイナリをASCIIに変換、およびその逆 を参照してください。

1
jfs

In Python 2、asciiエンコード(バイト)文字列もutf8エンコード(バイト)文字列です。InPython 3、(ユニコード)文字列encoded to utf8-encoded bytesである必要があります。

>>> X = "1000100100010110001101000001101010110011001010100"
>>> X.encode()
b'1000100100010110001101000001101010110011001010100'

数字「0」と「1」のみを含む文字列は特別な場合であり、同じ規則が適用されます。

1
Terry Jan Reedy