Si j'appelle os.urandom (64), on me donne 64 octets aléatoires. En référence à convertir les octets en une chaîne Python j'ai essayé
a = os.urandom(64)
a.decode()
a.decode("utf-8")
mais a obtenu l'erreur de trace indiquant que les octets ne sont pas dans utf-8.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 0: invalid start byte
avec les octets
b'\x8bz\xaf$\xb6\x93q\xef\x94\x99$\x8c\x1eO\xeb\xed\x03O\xc6L%\xe70\xf9\xd8
\xa4\xac\x01\xe1\xb5\x0bM#\x19\xea+\x81\xdc\xcb\xed7O\xec\xf5\\}\x029\x122
\x8b\xbd\xa9\xca\xb2\x88\r+\x88\xf0\xeaE\x9c'
Existe-t-il une méthode complète pour décoder ces octets en une représentation sous forme de chaîne? Je génère des jetons aléatoires Sudo pour suivre les documents associés sur plusieurs moteurs de base de données.
Le code ci-dessous fonctionnera sur les deux Python 2.7 et 3:
from base64 import b64encode
from os import urandom
random_bytes = urandom(64)
token = b64encode(random_bytes).decode('utf-8')
Vous pouvez utiliser l'encodage base-64. Dans ce cas:
a = os.urandom(64)
a.encode('base-64')
Notez également que j'utilise encode
ici plutôt que decode
, car decode
essaie de le prendre du format que vous spécifiez en unicode. Donc, dans votre exemple, vous traitez les octets aléatoires comme s'ils formaient un utf-8
chaîne, ce qui est rarement le cas avec des octets aléatoires.
Vous avez des octets aléatoires; Je serais très surpris si cela était décodable en une chaîne.
Si vous avez pour avoir une chaîne unicode, décodez à partir de Latin-1:
a.decode('latin1')
car il mappe les octets un à un aux points de code Unicode correspondants.