如果我调用 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 随机令牌来跟踪多个数据库引擎中的相关文档。
下面的代码适用于 Python 2.7 和 3:
from base64 import b64encode
from os import urandom
random_bytes = urandom(64)
token = b64encode(random_bytes).decode('utf-8')
你有随机字节;如果它可以解码为字符串,我会感到非常惊讶。
如果您有有一个unicode字符串,请从Latin-1解码:
a.decode('latin1')
因为它将字节一对一映射到相应的 Unicode 代码点。
您可以使用base-64编码。在这种情况下:
a = os.urandom(64)
a.encode('base-64')
另请注意,我在这里使用
encode
而不是 decode
,因为 decode
试图将其从您指定的任何格式转换为 unicode。因此,在您的示例中,您将随机字节视为形成有效的 utf-8
字符串,而随机字节很少出现这种情况。
您确定需要 64 个字节表示为字符串吗?
也许你真正需要的是N位代币? 如果是这样,请使用secrets。 Secrets 模块提供生成安全令牌的功能,适用于密码重置、难以猜测的 URL 等应用。
import secrets
>>> secrets.token_bytes(16)
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
>>> secrets.token_hex(16)
'f9bf78b9a18ce6d46a0cd2b0b86df9da'
>>> secrets.token_urlsafe(16)
'Drmhze6EPcv0fN_81Bj-nA'
或者也许您需要 64 个字符长度的随机字符串?
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(64))
这个简单的方法:
a = str(os.urandom(64))
print(F"the: {a}")
print(type(a))
当尝试使用编解码器使用
urandom(16)
进行编码/解码时,我会得到 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte
这就是我最终所做的。
import os
import binascii
a = binascii.hexlify(os.urandom(32)).decode()
print(a)
'fd78f19c8bdcd7bc086d5a34b8d0ebccbd501fd2eea18e46699bb52efa48ac3c'