Перетворення int в ASCII і назад в Python


137

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

Я можу придумати деякі химерні способи зробити це, але я здогадуюсь, що є кращі. Будь-які пропозиції?


можливий дублікат перетворення бази 62 в Python
mlissner

Відповіді:




9

Якщо кілька символів прив’язані до одного цілого числа / long, як це було в моїй проблемі:

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
Спасибі за запитання. Я дозволю це трохи не випадок використання в ОП, враховуючи, що кодування base64 або base58 було б найбільш застосовним. Я прийшов до цього питання на основі заголовка, буквально перетворюючи ціле число в текст ascii так, як ніби ціле число має кодовані дані ascii, вбудовані в його байти. Я опублікував цю відповідь у випадку, якщо інші прибули сюди з таким же бажаним результатом.
Меттью Девіс

7

А як щодо кодування 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

Повернення цього числа також не є великою справою.


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-адрес. Ви можете подивитися на реалізацію в модулі і зробити свій власний для цього конкретного випадку. :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.