您将如何将整数转换为基数 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/