it-roy-ru.com

Преобразовать int в ASCII и ​​обратно в Python

Я работаю над созданием сокращающего URL-адреса для своего сайта, и мой текущий план (я открыт для предложений) заключается в использовании идентификатора узла для создания сокращенного URL-адреса. Таким образом, теоретически, узел 26 может быть short.com/z, узел 1 может быть short.com/a, узел 52 может быть short.com/Z, а узел 104 может быть short.com/ZZ. Когда пользователь переходит на этот URL, мне нужно полностью изменить процесс (очевидно).

Я могу придумать несколько хитрых способов сделать это, но я предполагаю, что есть и лучшие. Какие-либо предложения?

117
mlissner

ASCII в int:

ord('a')

дает 97

И вернемся к строке:

  • в Python2: str(unichr(97))
  • в Python3: str(chr(97))

дает 'a'

204
Dominic Bou-Samra
>>> ord("a")
97
>>> chr(97)
'a'
82
renatov

Если несколько символов связаны внутри одного целого/длинного, как это было моей проблемой:

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

7
Matthew Davis

Как насчет 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

Превратить это обратно в число тоже не имеет большого значения.

6
Ivo Wetzel