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

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

最佳答案

对此没有标准模块,但我已经编写了自己的函数来实现这一点。

BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

def encode(num, alphabet):
    """Encode a positive number into Base X and return the string.

    Arguments:
    - `num`: The number to encode
    - `alphabet`: The alphabet to use for encoding
    """
    if num == 0:
        return alphabet[0]
    arr = []
    arr_append = arr.append  # Extract bound-method for faster access.
    _divmod = divmod  # Access to locals is faster.
    base = len(alphabet)
    while num:
        num, rem = _divmod(num, base)
        arr_append(alphabet[rem])
    arr.reverse()
    return ''.join(arr)

def decode(string, alphabet=BASE62):
    """Decode a Base X encoded string into the number

    Arguments:
    - `string`: The encoded string
    - `alphabet`: The alphabet to use for decoding
    """
    base = len(alphabet)
    strlen = len(string)
    num = 0

    idx = 0
    for char in string:
        power = (strlen - (idx + 1))
        num += alphabet.index(char) * (base ** power)
        idx += 1

    return num
请注意,您可以为其提供任何用于编码和解码的字母表。如果您不使用 alphabet 参数,您将获得在第一行代码中定义的 62 个字符字母表,因此编码/解码为 62 基数。
希望这可以帮助。
PS - 对于 URL 缩短器,我发现最好省略一些令人困惑的字符,如 0Ol1oI 等。因此我使用这个字母表来满足我的 URL 缩短需求 - "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"玩得开心。

关于python - Base 62 转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1119722/

10-16 02:17