43

如果我调用 os.urandom(64),我会得到 64 个随机字节。参考Convert bytes to a Python string我试过

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 随机令牌以跨多个数据库引擎跟踪相关文档。

4

4 回答 4

74

下面的代码适用于 Python 2.7 和 3:

from base64 import b64encode
from os import urandom

random_bytes = urandom(64)
token = b64encode(random_bytes).decode('utf-8')
于 2014-02-21T06:51:37.137 回答
13

你有随机字节;如果可以将其解码为字符串,我会感到非常惊讶。

如果您必须有一个 unicode 字符串,请从 Latin-1 解码:

a.decode('latin1')

因为它将字节一对一地映射到相应的 Unicode 代码点。

于 2013-07-30T22:11:38.693 回答
10

您可以使用 base-64 编码。在这种情况下:

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

另请注意,我在encode这里使用而不是decode,因为decode试图将其从您指定的任何格式转换为 unicode。因此,在您的示例中,您将随机字节视为形成有效utf-8字符串,而随机字节很少出现这种情况。

于 2013-07-30T22:11:54.107 回答
1

这种简单的方法:

a = str(os.urandom(64))
print(F"the: {a}")
print(type(a))
于 2020-10-22T11:54:14.953 回答