web-dev-qa-db-fra.com

Binaire en chaîne/texte en Python

J'ai effectué plusieurs recherches en ligne et je n'ai pas trouvé de moyen de convertir ma variable de chaîne binaire,X

X = "1000100100010110001101000001101010110011001010100"

dans une valeur de chaîne UTF-8.

J'ai constaté que certaines personnes utilisent des méthodes telles que

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

cependant, cette méthode n'a pas fonctionné pour moi, car «b» est dit inexistant et je ne sais pas comment remplacer le «message» par une variable. Non seulement, mais je n'ai pas compris comment cette méthode fonctionne. Y a-t-il une meilleure alternative?

Alors, comment pourrais-je convertir une chaîne binaire en une chaîne de texte?

EDIT: Je ne me préoccupe pas non plus du décodage ASCII

CLARIFICATION: Voici précisément ce que je voudrais arriver.

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

Cela donnerait alors la ficelle ...

hi

Merci, Daniel

5
Dan

On dirait que vous essayez de décoder les caractères ASCII d'une représentation sous forme de chaîne binaire (chaîne de bits) de chaque caractère.

Vous pouvez prendre chaque bloc de huit caractères (un octet), le convertir en entier, puis le convertir en un caractère avec chr():

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

En supposant que les valeurs encodées dans la chaîne soient ASCII, cela vous donnera les caractères. Vous pouvez le généraliser comme ceci:

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

Si vous souhaitez le conserver dans l'encodage d'origine, vous n'avez pas besoin de le décoder davantage. Habituellement, vous convertissez la chaîne entrante en chaîne Python unicode et vous pouvez le faire comme ceci (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)
2
mhawke

Fournissez l'argument de base facultatif à int pour convertir:

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

Pour convertir des bits donnés en tant que chaîne "01" (chiffres binaires) en texte correspondant dans Python 3:

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

Pour une solution Python 2/3, voir Convertissez les fichiers binaires en ASCII et inversement .

1
jfs

En Python 2, une chaîne codée en ascii (octet) est également une chaîne codée en utf8 (octet) . En Python 3, une chaîne (unicode) doit être codée en octets codés en utf8. L'exemple de décodage allait dans le mauvais sens.

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

Les chaînes contenant uniquement les chiffres «0» et «1» constituent un cas particulier et les mêmes règles s'appliquent.

1
Terry Jan Reedy