Python encode base64不期望正确的结果?

2024-09-21 03:17:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个base64编码方法来将大整数转换为base64。然而,当我测试我的方法时,我发现结果很奇怪。虽然encode_b64(int('908540701891980503'))方法给了我ybyPRoQW0X,但是我期望正确的ybyPRoQWzX

def encode_b64(n):
    table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
    result = []
    temp = n
    if 0 == temp:
        return '0'
    else:
        while 0 < temp:
            idx = temp % 64
            result.append(table[idx])
            temp /= 64
            temp = int(temp)
    return ''.join([x for x in reversed(result)])

我检查了好几次,但没有发现逻辑错误。我的代码怎么了


Tags: 方法returndeftable整数resulttempencode
2条回答

这是典型的整数除法问题

在python2中temp /= 64将执行整数除法,因此您的代码可以正常工作。但在python3中,这将导致一个浮动

要解决python3中的问题,请将temp /= 64更改为temp //= 64,以强制整数除法并去掉temp = int(temp)

您应该在这里使用整数除法,所以temp //= 64而不是temp /= 64

def encode_b64(n):
    table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
    if not n:
        return 'A'
    result = []
    while n:
        result.append(table[n % 64])
        n //= 64
    return ''.join(reversed(result))

这给了我们:

>>> encode_b64(908540701891980503)
'ybyPRoQWzX'

对于小的数字来说,这不会有什么区别,但是大的浮点数有舍入错误,因此使用int(..)可能会得到稍微不同的结果

如果要进一步优化上述a,可以使用位运算,如:

def encode_b64(n):
    table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
    if not n:
        return 'A'
    result = []
    while n:
        result.append(table[n & 0x3f])
        n >>= 6
    return ''.join(reversed(result))

相关问题 更多 >

    热门问题