为了账号安全,请及时绑定邮箱和手机立即绑定

Base 62转换

Base 62转换

慕码人8056858 2019-10-05 13:16:29
您将如何将整数转换为以62为底的整数(如十六进制,但具有以下数字:“ 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”)。我一直试图为它找到一个好的Python库,但是它们似乎都被转换字符串所占据。Python base64模块仅接受字符串,并将一个数字转换为四个字符。我一直在寻找类似于URL缩短器使用的东西。
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

我曾经写过一个脚本也可以做到这一点,我觉得它很优雅:)


import string

# Remove the `_@` below for base62, now it has 64 characters

BASE_LIST = string.digits + string.letters + '_@'

BASE_DICT = dict((c, i) for i, c in enumerate(BASE_LIST))


def base_decode(string, reverse_base=BASE_DICT):

    length = len(reverse_base)

    ret = 0

    for i, c in enumerate(string[::-1]):

        ret += (length ** i) * reverse_base[c]


    return ret


def base_encode(integer, base=BASE_LIST):

    if integer == 0:

        return base[0]


    length = len(base)

    ret = ''

    while integer != 0:

        ret = base[integer % length] + ret

        integer /= length


    return ret

用法示例:


for i in range(100):                                    

    print i, base_decode(base_encode(i)), base_encode(i)


查看完整回答
反对 回复 2019-10-05
?
RISEBY

TA贡献1856条经验 获得超5个赞

下面的解码器制造商可以使用任何合理的基础,具有更整洁的循环,并在遇到无效字符时给出明确的错误消息。


def base_n_decoder(alphabet):

    """Return a decoder for a base-n encoded string

    Argument:

    - `alphabet`: The alphabet used for encoding

    """

    base = len(alphabet)

    char_value = dict(((c, v) for v, c in enumerate(alphabet)))

    def f(string):

        num = 0

        try:

            for char in string:

                num = num * base + char_value[char]

        except KeyError:

            raise ValueError('Unexpected character %r' % char)

        return num

    return f


if __name__ == "__main__":

    func = base_n_decoder('0123456789abcdef')

    for test in ('0', 'f', '2020', 'ffff', 'abqdef'):

        print test

        print func(test)


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 972 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信