我想以最短的方式表示URL中的整数。例如,可以使用十六进制将11234缩短为“ 2be2”。由于base64使用的是64个字符的编码,因此应该有可能使用比十六进制更少的字符来表示base64中的整数。问题是我不知道使用Python将整数转换为base64(然后再转换回)的最干净方法。
base64模块具有处理字节串的方法-因此,也许一种解决方案是将整数转换为Python字符串的二进制表示形式…但是我也不知道该怎么做。
这个答案在本质上与道格拉斯·里德(Douglas Leeder)的相似,但有以下变化:
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)) '$_____'
一些注意事项: