Python 'long' 对象没有 'to_bytes' 属性?
我正在尝试使用一个用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'