gpt4 book ai didi

python - 如何将整数转换为 Python 中最短的 url 安全字符串?

转载 作者:IT老高 更新时间:2023-10-28 21:42:20 26 4
gpt4 key购买 nike

我想要在 URL 中以最短的方式表示整数。例如,可以使用十六进制将 11234 缩短为“2be2”。由于 base64 使用的是 64 字符编码,因此应该可以使用比十六进制更少的字符来表示 base64 中的整数。问题是我想不出使用 Python 将整数转换为 base64(然后再转换回来)的最简洁方法。

base64 模块具有处理字节串的方法 - 所以也许一种解决方案是将整数转换为其二进制表示形式作为 Python 字符串......但我也不知道该怎么做。

最佳答案

这个答案在精神上与 Douglas Leeder 的相似,但有以下变化:

  • 它不使用实际的 Base64,因此没有填充字符
  • 它不是先将数字转换为字节字符串(以 256 为基数),而是将其直接转换为以 64 为基数的数字,其优点是可以使用符号字符表示负数。

    import string
    ALPHABET = string.ascii_uppercase + string.ascii_lowercase + \
    string.digits + '-_'
    ALPHABET_REVERSE = dict((c, i) for (i, c) in enumerate(ALPHABET))
    BASE = len(ALPHABET)
    SIGN_CHARACTER = '$'

    def num_encode(n):
    if n < 0:
    return SIGN_CHARACTER + num_encode(-n)
    s = []
    while True:
    n, r = divmod(n, BASE)
    s.append(ALPHABET[r])
    if n == 0: break
    return ''.join(reversed(s))

    def num_decode(s):
    if s[0] == SIGN_CHARACTER:
    return -num_decode(s[1:])
    n = 0
    for c in s:
    n = n * BASE + ALPHABET_REVERSE[c]
    return n

    >>> num_encode(0)
'A'
>>> num_encode(64)
'BA'
>>> num_encode(-(64**5-1))
'$_____'

一些旁注:

  • 您可以(略微)通过将 string.digits 放在字母表中的第一位(并将符号字符设为“-”)来增加 base-64 数字的人类可读性;我根据 Python 的 urlsafe_b64encode 选择了我做的顺序。
  • 如果您要编码大量负数,则可以通过使用符号位或 1/2 的补码代替符号字符来提高效率。
  • 您应该能够通过更改字母表轻松地使此代码适应不同的基数,将其限制为仅限字母数字字符或添加其他“URL 安全”字符。
  • 我建议反对在大多数情况下在 URI 中使用基数 10 以外的表示形式——它增加了复杂性,并且与 HTTP 的开销相比,在没有显着节省的情况下使调试变得更加困难——除非你想要TinyURL 风格的东西。

关于python - 如何将整数转换为 Python 中最短的 url 安全字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/561486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com