Je suis à la recherche d'un moyen d'obtenir la représentation binaire d'une chaîne de caractères en python, par exemple
st = "hello world"
toBinary(st)
Existe-t-il un module permettant de réaliser cette opération ?
Je suis à la recherche d'un moyen d'obtenir la représentation binaire d'une chaîne de caractères en python, par exemple
st = "hello world"
toBinary(st)
Existe-t-il un module permettant de réaliser cette opération ?
Quelque chose comme ça ?
>>> 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'
Si par binaire vous voulez dire bytes
vous pouvez simplement utiliser encode
méthode de l'objet string qui encode votre chaîne comme un objet bytes en utilisant le type d'encodage passé. Vous devez juste vous assurer que vous passez un encodage correct à encode
fonction.
In [9]: "hello world".encode('ascii')
Out[9]: b'hello world'
In [10]: byte_obj = "hello world".encode('ascii')
In [11]: byte_obj
Out[11]: b'hello world'
In [12]: byte_obj[0]
Out[12]: 104
Sinon, si vous les voulez sous forme de zéros et de uns - représentation binaire - d'une manière plus pythique, vous pouvez d'abord convertir votre chaîne en tableau d'octets puis utiliser bin
fonction au sein de map
:
>>> st = "hello world"
>>> map(bin,bytearray(st))
['0b1101000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1110111', '0b1101111', '0b1110010', '0b1101100', '0b1100100']
Ou vous pouvez le rejoindre :
>>> ' '.join(map(bin,bytearray(st)))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
Notez que dans python3 vous devez spécifier un encodage pour bytearray
fonction :
>>> ' '.join(map(bin,bytearray(st,'utf8')))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
Vous pouvez également utiliser binascii
dans python 2 :
>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'
hexlify
renvoie la représentation hexadécimale des données binaires, vous pouvez alors les convertir en int en spécifiant 16 comme base, puis les convertir en binaire avec bin
.
Vous pouvez accéder aux valeurs de code pour les caractères de votre chaîne en utilisant la fonction ord()
fonction intégrée. Si vous devez ensuite formater cette information en binaire, la fonction string.format()
fera l'affaire.
a = "test"
print(' '.join(format(ord(x), 'b') for x in a))
(Merci à Ashwini Chaudhary d'avoir publié cet extrait de code).
Bien que le code ci-dessus fonctionne dans Python 3, la situation se complique si vous utilisez un encodage autre que UTF-8. Dans Python 2, les chaînes de caractères sont des séquences d'octets, et l'encodage ASCII est supposé par défaut. Dans Python 3, les chaînes de caractères sont supposées être Unicode, et il y a un module séparé bytes
qui se comporte davantage comme une chaîne Python 2. Si vous souhaitez utiliser un encodage autre que l'UTF-8, vous devez le spécifier.
En Python 3, vous pouvez donc faire quelque chose comme ceci :
a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))
Les différences entre l'encodage UTF-8 et l'encodage ascii ne sont pas évidentes pour les chaînes alphanumériques simples, mais elles deviennent importantes si vous traitez du texte comprenant des caractères qui ne font pas partie du jeu de caractères ascii.
Dans Python version 3.6 et supérieure, vous pouvez utiliser f-chaîne pour formater le résultat.
str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))
01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
Le côté gauche des deux points, ord(i), est l'objet réel dont la valeur sera formatée et insérée dans la sortie. L'utilisation de ord() vous donne le point de code en base 10 pour un seul caractère str.
Le côté droit des deux points est le spécificateur de format. 08 signifie largeur 8, 0 padded, et le b fonctionne comme un signe pour sortir le format nombre résultant en base 2 (binaire).
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.