将 int 转换为 ASCII 并返回 Python

Posted

技术标签:

【中文标题】将 int 转换为 ASCII 并返回 Python【英文标题】:Convert int to ASCII and back in Python 【发布时间】:2011-04-10 01:28:11 【问题描述】:

我正在为我的网站制作 URL 缩短器,我目前的计划(我愿意接受建议)是使用节点 ID 来生成缩短的 URL。因此,理论上,节点 26 可能是 short.com/z,节点 1 可能是 short.com/a,节点 52 可能是 short.com/Z,节点 104 可能是 short.com/ZZ。当用户访问该 URL 时,我需要反转该过程(显然)。

我可以想到一些笨拙的方法来解决这个问题,但我猜还有更好的方法。有什么建议吗?

【问题讨论】:

【参考方案1】:

ASCII 转 int:

ord('a')

97

然后返回一个字符串:

在 Python2 中:str(unichr(97)) 在 Python3 中:chr(97)

'a'

【讨论】:

python3 中的 chr()! 在 ascii 字符 (0 - 255) 范围内的 chr 单词,但是,unichr 适用于 unicode 字符集。【参考方案2】:

如果多个字符被绑定在一个整数/长整数中,我的问题是:

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

【讨论】:

感谢您的提问。考虑到 base64 或 base58 编码最适用,我承认它与 OP 中的用例略有不同。我已经根据标题得出了这个问题,将整数转换为 ascii 文本,就好像整数在其字节中嵌入了 ascii 编码数据一样。如果其他人以相同的期望结果到达这里,我会发布此答案。【参考方案3】:
>>> ord("a")
97
>>> chr(97)
'a'

【讨论】:

【参考方案4】:

对 URL 进行 BASE58 编码怎么样?就像 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

把它变成一个数字也没什么大不了的。

【讨论】:

这很棒。我最终在这里找到了另一个(更完整的)答案:***.com/questions/1119722/…【参考方案5】:

使用hex(id)[2:]int(urlpart, 16)。还有其他选择。 base32 编码你的 id 也可以,但我不知道有没有任何库可以在 Python 中内置 base32 编码。

显然,base32 编码器是在 Python 2.4 中引入的,带有 base64 module。您可以尝试使用b32encodeb32decode。您应该为b32decode 提供casefoldmap01 选项的True,以防人们记下您的缩短网址。

实际上,我收回了这一点。我仍然认为 base32 编码是一个好主意,但是该模块对于 URL 缩短的情况没有用。您可以查看模块中的实现并为这种特定情况制作自己的实现。 :-)

【讨论】:

以上是关于将 int 转换为 ASCII 并返回 Python的主要内容,如果未能解决你的问题,请参考以下文章

ASCII与字符的转换

Python 中如何实现int 和 string 的转换?

将 2 个 ASCII char 值转换为 short int

c语言怎样实现将一个数值(int型)转换为各位对应的ASCII码

如何将枚举泛型类型的变量转换为 int 并返回

如何在JAVA中打印int的ASCII值