Конвертировать int в ASCII и обратно в Python

138

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

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

mlissner
источник
возможный дубликат конвертации Base 62 в Python
mlissner

Ответы:

240

ASCII в int:

ord('a')

дает 97

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

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

дает 'a'

Доминик Бу-Самра
источник
82
и просто chr () в python3!
Эсан М. Кермани
1
chr слова в диапазоне символов ascii (0 - 255), однако, unichr работает для набора символов unicode.
Шивендра Сони
9

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

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

Мэтью Дэвис
источник
2
Спасибо за вопрос. Я признаю, что это немного отличается от варианта использования в OP, учитывая, что кодировка base64 или base58 была бы наиболее применимой. Я пришел к этому вопросу, основываясь на заголовке, буквально преобразовав целое число в текст ascii, как будто целое число содержит данные в кодировке ascii, встроенные в его байты. Я отправил этот ответ в случае, если другие прибыли сюда с таким же желаемым результатом.
Мэтью Дэвис,
7

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

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

Иво Ветцель
источник
2
Это круто. В итоге я нашел еще один (более полный) ответ на SO: stackoverflow.com/questions/1119722/…
mlissner
-1

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

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

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

всевозможный
источник