Подтвердить что ты не робот

Как я могу преобразовать уранд python в строку?

Если я вызываю os.urandom(64), мне дают 64 случайных байта. Что касается Преобразование байтов в строку Python Я пробовал

a = os.urandom(64)
a.decode()
a.decode("utf-8")

но получил ошибку трассировки, указав, что байты не находятся в 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

с байтами

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'

Существует ли полный метод для декодирования этих байтов в каком-то строчном представлении? Я создаю случайные токены sudo для отслеживания связанных документов в нескольких механизмах баз данных.

4b9b3361

Ответ 1

В python 3 ответ

from base64 import b64encode
from os import urandom

random_bytes = urandom(64)
token = b64encode(random_bytes).decode('utf-8')

Ответ 2

Вы можете использовать кодировку base-64. В этом случае:

a = os.urandom(64)
a.encode('base-64')

Также обратите внимание, что я использую encode здесь, а не decode, поскольку decode пытается взять его из любого формата, который вы указываете в unicode. Итак, в вашем примере вы обрабатываете случайные байты, как если бы они формировали допустимую строку utf-8, что редко случается со случайными байтами.

Ответ 3

У вас есть случайные байты; Я был бы очень удивлен, если бы это было декодируемо для строки.

Если у вас есть, чтобы иметь строку юникода, декодируйте с латинского-1:

a.decode('latin1')

поскольку он сопоставляет байты один на один с соответствующими кодовыми точками Unicode.