web-dev-qa-db-fra.com

Comment puis-je convertir un python urandom en chaîne?

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.

28
user1876508

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')
53
user1876508

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.

14
Rob Watts

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.

9
Martijn Pieters