Python 'long' 对象没有 'to_bytes' 属性?

6 投票
4 回答
25723 浏览
提问于 2025-04-18 08:19

我正在尝试使用一个用Python写的比特币地址验证器,具体内容可以在这里找到:

不过,这段代码让我遇到了一些麻烦:

def decode_base58(bc, length):
    n = 0
    for char in bc:
        n = n * 58 + digits58.index(char)
    return n.to_bytes(length, 'big')

我知道n要么是一个整数,要么是一个长整型,但这两者都没有叫做to_bytes的方法,所以我不太明白这段代码是怎么能正常工作的?

有没有人知道这里出了什么问题?是我做错了什么,还是这段代码本身就写错了?欢迎任何建议!

4 个回答

-2

你链接的代码包含:

assert n.to_bytes(length, 'big') == bytes( (n >> i*8) & 0xff for i in reversed(range(length)))

这意味着你可以定义一个 to_bytes 函数:

def to_bytes(n, length):
    return bytes( (n >> i*8) & 0xff for i in reversed(range(length)))

然后可以这样使用它:

def decode_base58(bc, length):
    n = 0
    for char in bc:
        n = n * 58 + digits58.index(char)
    return to_bytes(n, length)
-1

从Python 3.2开始,内置的整数类型提供了一个叫做to_bytes的方法。

你可以在这里查看相关的文档:https://docs.python.org/3/library/stdtypes.html#int.to_bytes

0

这段话的意思是,@martineau 在评论中给出的内容帮我得到了想要的结果。

''.join(chr((n >> i*8) & 0xff) for i in reversed(range(length)))
14

在Python 2.7中,int(整数)和long(长整数)这两种类型没有.to_bytes这个方法。而在Python 3.2中,int类型就有了.to_bytes这个方法。

对于Python 2.x,可以使用以下方法来解决这个问题:

>>> length = 10
>>> n = 123456789
>>> ('%%0%dx' % (length << 1) % n).decode('hex')[-length:]
'\x00\x00\x00\x00\x00\x00\x07[\xcd\x15'

撰写回答