Конвертировать int в ASCII и обратно в Python - PullRequest
117 голосов
/ 09 сентября 2010

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

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

Ответы [ 5 ]

204 голосов
/ 09 сентября 2010

ASCII в int:

ord('a')

дает 97

И обратно в строку:

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

дает 'a'

82 голосов
/ 28 июня 2015
>>> ord("a")
97
>>> chr(97)
'a'
7 голосов
/ 28 февраля 2017

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

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

6 голосов
/ 09 сентября 2010

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

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

0 голосов
/ 09 сентября 2010

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

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

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

...