在Python中将int转换为ASCII并返回
我正在为我的站点制作一个URL缩短器,我目前的计划(我愿意接受建议)是使用一个节点ID来生成缩短的URL。因此,理论上,节点26可能是在Python中将int转换为ASCII并返回,python,integer,ascii,encode,Python,Integer,Ascii,Encode,我正在为我的站点制作一个URL缩短器,我目前的计划(我愿意接受建议)是使用一个节点ID来生成缩短的URL。因此,理论上,节点26可能是short.com/z,节点1可能是short.com/a,节点52可能是short.com/z,节点104可能是short.com/ZZ。当用户访问该URL时,我需要反转该过程(显然) 我可以想出一些笨拙的方法来解决这个问题,但我猜还有更好的方法。有什么建议吗?使用hex(id)[2:]和int(urlpart,16)。还有其他选择。base32编码您的id也可
short.com/z
,节点1可能是short.com/a
,节点52可能是short.com/z
,节点104可能是short.com/ZZ
。当用户访问该URL时,我需要反转该过程(显然)
我可以想出一些笨拙的方法来解决这个问题,但我猜还有更好的方法。有什么建议吗?使用hex(id)[2:]
和int(urlpart,16)
。还有其他选择。base32编码您的id也可以工作,但我不知道有任何库在Python中内置base32编码
显然,在Python2.4中引入了base32编码器。您可以尝试使用b32encode
和b32decode
。您应该为casefold
和map01
选项提供True
,以防人们写下您缩短的URL
事实上,我收回这句话。我仍然认为base32编码是一个好主意,但该模块对于URL缩短的情况并不有用。您可以查看模块中的实现,并针对此特定情况制定自己的解决方案。:-) ASCII到int:
ord('a')
给出97
回到字符串:
- 在Python2中:
str(unichr(97))
- 在Python3中:
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
将其转换为数字也不是什么大问题。如果在一个整数/长度内绑定了多个字符,就像我的问题一样:
>>> ord("a")
97
>>> chr(97)
'a'
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))
s='0123456789'
nchars=len(s)
#字符串设置为int或long。类型取决于nchars
x=范围内字节(nchars)的和(ord(s[字节])8*(nchars-byte-1))&0xFF)
产量
'0123456789'
和x=227581098929683594426425L
这太棒了。最后我在这里找到了另一个(更完整的)答案:python3中的chr()!但是,unichr适用于unicode字符集。谢谢您的询问。考虑到base64或base58编码将是最适用的,我承认它与OP中的用例略有出入。我是根据标题来回答这个问题的,从字面上讲,我将整数转换为ascii文本,就好像整数的字节中嵌入了ascii编码的数据一样。如果其他人带着同样的期望结果来到这里,我就发布了这个答案。