将int转换为ASCII并返回到Python

我正在为我的网站做一个url缩短的工具,而我目前的计划(我接受build议)是使用节点ID来生成缩短的url。 因此,理论上,节点26可能是short.com/z ,节点1可能是short.com/a ,节点52可能是short.com/Z ,节点104可能是short.com/ZZ 。 当用户转到该URL时,我需要反转该过程(显然)。

我可以想到一些可行的办法,但我猜测还有更好的办法。 有什么build议么?

ASCII到int:

 ord('a') 

97

回到一个string:

 str(unichr(97)) 

'a'

 >>> ord("a") 97 >>> chr(97) 'a' 

BASE58编码的URL呢? 比如flickr就是这样。

 # note the missing lowercase L and the zero etc. BASE58 = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' url = '' while node_id >= 58: div, mod = divmod(node_id, 58) url = BASE58[mod] + url node_id = int(div) return 'http://short.com/%s' % BASE58[node_id] + url 

把这个变成一个数字也不是什么大不了的事情。

如果在一个整数/长整数内绑定多个字符,就像我的问题一样:

 s = '0123456789' nchars = len(s) # string to int or long. Type depends on nchars x = sum(ord(s[byte])<<8*(nchars-byte-1) for byte in range(nchars)) # int or long to string ''.join(chr((x>>8*(nchars-byte-1))&0xFF) for byte in range(nchars)) 

产量'0123456789'x = 227581098929683594426425L

使用hex(id)[2:]int(urlpart, 16) 。 还有其他的select。 base32编码你的ID也可以,但是我不知道有什么库在Python中内置base32编码。

显然,Python 2.4中引入了base32编码器和base64模块 。 你可以尝试使用b32encodeb32decode 。 如果用户写下缩短的url,则应该将casefoldmap01选项都casefold True

其实我回来了 我仍然认为base32编码是一个好主意,但是这个模块在URL缩短的情况下是没有用的。 您可以查看模块中的实现,并针对此特定情况制定自己的实现。 🙂