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

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

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

Ответ 1

ASCII для int:

ord('a')

дает 97

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

str(unichr(97))

дает 'a'

Ответ 2

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

Ответ 3

Как насчет кодировки 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

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

Ответ 4

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

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

Ответ 5

Используйте hex(id)[2:] и int(urlpart, 16). Есть и другие варианты. base32, кодирующий ваш id, мог бы работать, но я не знаю, что есть библиотека, которая кодирует base32, встроенную в Python.

По-видимому, кодер base32 был введен в Python 2.4 с base64 module. Вы можете попробовать использовать b32encode и b32decode. Вы должны дать True для параметров casefold и map01 для b32decode, если люди запишут ваши сокращенные URL-адреса.

Собственно, я забираю это. Я по-прежнему считаю, что кодировка base32 - хорошая идея, но этот модуль не подходит для сокращения URL-адресов. Вы можете посмотреть на реализацию в модуле и сделать свой собственный для этого конкретного случая.: -)