【问题标题】:decode os.urandom() bytes object解码 os.urandom() 字节对象
【发布时间】:2014-12-28 23:51:10
【问题描述】:

我正在尝试获得一个 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' 对象没有属性 'codecs'

所以我卡住了,我该怎么做才能解决这个问题?我听说这是在 Python 2x 中工作的,但我需要在 3x 中使用它。

【问题讨论】:

    标签: python string hex ascii decode


    【解决方案1】:

    使用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() 处理任意编解码器
    • @tamamdir,删除 .decode('hex') 部分。只需binascii.hexlify(os.urandom(32))binascii.hexlify(os.urandom(32)).decode()
    【解决方案2】:

    在 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.hexlifybinascii.unhexlify

    【讨论】:

      【解决方案3】:
      private_key = "".join(["%02x" % ord(x) for x in os.urandom(32)])
      

      【讨论】:

      • 这会产生错误:TypeError: ord() expected string of length 1, but int found.
      • 先生。我所以删除 ord(),只留下 x。我在 BSD 和 Linux 上的顺序只有 2.7,可能在其他平台上 urandom() 工作方式不同
      猜你喜欢
      • 1970-01-01
      • 2019-10-10
      • 2019-07-20
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多