我试图获得一个 private_key ,所以我尝试了这个:
private_key = os.urandom(32).encode('hex')
但它引发了这个错误:
AttributeError: 'bytes' object has no attribute 'encode'
所以我检查问题并解决了,在Python3x字节中只能解码。然后我将其更改为:
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')
它说
AttributeError:' bytes'对象没有属性'编解码器'
所以我卡住了,我该怎么做才能解决这个问题?我听说这是在Python 2x中工作,但我需要在3x中使用它。
答案 0 :(得分:11)
使用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'
答案 1 :(得分:1)
在Python 3中,bytes
对象没有.encode()
方法(以加强Unicode文本与二进制数据(字节)的区别)。
对于字节到字节的转换,您可以use codecs.encode()
method:
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.hexlify
,binascii.unhexlify
。
答案 2 :(得分:0)
private_key = "".join(["%02x" % ord(x) for x in os.urandom(32)])