Base 62转换

您将如何将整数转换为以62为底的整数(如十六进制,但具有以下数字:“ 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”)。

我一直试图为它找到一个好的Python库,但是它们似乎都被转换字符串所占据。Python base64模块仅接受字符串,并将一个数字转换为四个字符。我一直在寻找类似于URL缩短器使用的东西。


慕码人8056858
浏览 973回答 3
3回答

慕尼黑8549860

我曾经写过一个脚本也可以做到这一点,我觉得它很优雅:)import string# Remove the `_@` below for base62, now it has 64 charactersBASE_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 retdef 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)

RISEBY

下面的解码器制造商可以使用任何合理的基础,具有更整洁的循环,并在遇到无效字符时给出明确的错误消息。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 fif __name__ == "__main__":    func = base_n_decoder('0123456789abcdef')    for test in ('0', 'f', '2020', 'ffff', 'abqdef'):        print test        print func(test)
打开App,查看更多内容
随时随地看视频慕课网APP