解码 os.urandom() 字节对象

9

我试图获取一个私钥(private_key),所以我尝试了以下代码:

private_key = os.urandom(32).encode('hex')

但是它会抛出这个错误:
AttributeError: 'bytes' object has no attribute 'encode'

所以我检查了问题并解决了,在Python3x中bytes只能被解码。然后我将其更改为:

private_key = os.urandom(32).decode('hex')

但现在它会抛出这个错误:
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

我真的不明白为什么。当我在上一次出错后尝试这个方法时;

private_key = os.urandom(32).codecs.decode('hex')

报错信息提示:

属性错误: 'bytes' 对象没有 'codecs' 属性

我遇到了困境,请问应该如何解决?听说在Python 2x版本中可以正常运行,但我需要在Python 3x版本中使用。

3个回答

21
使用 binascii.hexlify。它适用于 Python 2.x 和 Python 3.x。
>>> import binascii
>>> binascii.hexlify(os.urandom(32))
b'daae7948824525c1b8b59f9d5a75e9c0404e46259c7b1e17a4654a7e73c91b87'

如果你需要在 Python 3.x 中使用字符串对象而不是字节对象,可以使用 decode() 方法:
>>> binascii.hexlify(os.urandom(32)).decode()
'daae7948824525c1b8b59f9d5a75e9c0404e46259c7b1e17a4654a7e73c91b87'

_private_key = binascii.hexlify(os.urandom(32)).decode('hex') LookupError: 'hex' 不是文本编码; 使用codecs.decode()来处理任意编码 - user4398428
2
@tamamdir,删除.decode('hex')部分。只需使用binascii.hexlify(os.urandom(32))binascii.hexlify(os.urandom(32)).decode() - falsetru

3
在Python 3中,bytes对象没有.encode()方法(以加强Unicode文本与二进制数据(字节)之间的区别)。
对于字节到字节的转换,您可以使用{{link1:codecs.encode()方法}}:
import codecs
import os

print(codecs.encode(os.urandom(32), 'hex').decode())

并且反过来:

print(codecs.decode(hex_text, 'hex')) # print representation of bytes object

注意:没有调用.decode(),因为os.urandom返回的字节没有字符编码(它不是文本,只是一个随机的字节序列)。 codecs 可能在内部使用binascii.hexlifybinascii.unhexlify

0
private_key = "".join(["%02x" % ord(x) for x in os.urandom(32)])

这会产生错误:TypeError:ord()期望长度为1的字符串,但发现整数。 - hostingutilities.com
先生,请删除ord(),只留下x。 我只有在BSD和Linux上的2.7版本,也许在其他平台上urandom()的工作方式不同。 - Jan Boo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接