将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模块 。 你可以尝试使用b32encode
和b32decode
。 如果用户写下缩短的url,则应该将casefold
和map01
选项都casefold
True
。
其实我回来了 我仍然认为base32编码是一个好主意,但是这个模块在URL缩短的情况下是没有用的。 您可以查看模块中的实现,并针对此特定情况制定自己的实现。 🙂