在python 2和3中使用`bytes`

时间:2014-11-07 03:45:39

标签: python-2.7 python-3.x

我正在尝试编写一个比特币地址验证器,我正在尝试使用Python 2和3。

import codecs
from hashlib import sha256

digits58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

def to_bytes(n, length):
    s = '%x' % n
    s = s.rjust(length*2, '0')
    s = codecs.decode(bytes(s, 'UTF-8'), 'hex_codec')
    return s

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

def check_bc(bc):
    bcbytes = decode_base58(bc, 25)
    return bcbytes[-4:] == sha256(sha256(bcbytes[:-4]).digest()).digest()[:4]

if __name__ == '__main__':
    print(check_bc('1111111111111111111114oLvT2'))

此代码应运行并打印True。相反,它在Python 2中的这一行出错:

s = codecs.decode(bytes(s, 'UTF-8'), 'hex_codec')

错误:

TypeError: str() takes at most 1 argument (2 given)

如果我删除了' UTF-8'部分,它在Python 3中打破了。如果我完全删除对bytes的调用,则会在Python 3中中断。

1 个答案:

答案 0 :(得分:4)

IIUC,您可以直接bytes来代替encode

s = codecs.decode(s.encode("UTF-8"), 'hex_codec')

给出了

dsm@notebook:~/coding$ python2.7 bitcoin.py
True
dsm@notebook:~/coding$ python3.4 bitcoin.py
True