这个答案在本质上与道格拉斯·里德(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_enpre(n): if n < 0: return SIGN_CHARACTER + num_enpre(-n) s = [] while True: n, r = divmod(n, base) s.append(ALPHABET[r]) if n == 0: break return ''.join(reversed(s)) def num_depre(s): if s[0] == SIGN_CHARACTER: return -num_depre(s[1:]) n = 0 for c in s: n = n * base + ALPHABET_REVERSE[c] return n
>>> num_enpre(0) 'A' >>> num_enpre(64) 'BA' >>> num_enpre(-(64**5-1)) '$_____'
一些注意事项:
- 您可以(以 微不足道的方式 )通过将string.digits放在字母表的首位(并使符号字符为“-”)来提高64位基数的可读性。我根据Python的urlsafe_b64enpre选择了执行的顺序。
- 如果要编码很多负数,则可以使用符号位或一个/两个补码代替符号字符来提高效率。
- 通过更改字母,您应该能够轻松地使此代码适应不同的基础,将其限制为仅字母数字字符或添加其他“ URL安全”字符。
- 我建议 不要 在大多数情况下在URI中使用除base 10以外的表示形式-与HTTP的开销相比,它增加了复杂性并使调试更加困难而又没有大量的节省-除非您要使用TinyURL式的外观。



