Konwertuj int na ASCII iz powrotem w Pythonie

137

Pracuję nad stworzeniem skracacza adresów URL dla mojej witryny, a mój obecny plan (jestem otwarty na sugestie) zakłada użycie identyfikatora węzła do wygenerowania skróconego adresu URL. Zatem teoretycznie może to być węzeł 26 short.com/z, węzeł 1 short.com/a, węzeł 52 short.com/Zi węzeł 104 short.com/ZZ. Kiedy użytkownik przechodzi do tego adresu URL, muszę odwrócić ten proces (oczywiście).

Przychodzi mi do głowy kilka niezdarnych sposobów, aby to osiągnąć, ale domyślam się, że są lepsze. Jakieś sugestie?

mlissner
źródło
możliwy duplikat konwersji Base 62 w Pythonie
mlissner

Odpowiedzi:

239

ASCII do int:

ord('a')

daje 97

I wracając do ciągu:

  • w Pythonie2: str(unichr(97))
  • w Pythonie3: chr(97)

daje 'a'

Dominic Bou-Samra
źródło
82
i po prostu chr () w python3!
Ehsan M. Kermani,
1
chr w zakresie znaków ascii (0 - 255), jednak unichr działa dla zestawu znaków Unicode.
Shivendra Soni
98
>>> ord("a")
97
>>> chr(97)
'a'
renatov
źródło
9

Jeśli wiele znaków jest powiązanych w jednej liczbie całkowitej / długości, tak jak mój problem:

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))

Plony '0123456789'ix = 227581098929683594426425L

Matthew Davis
źródło
2
Dzięki, że pytasz. Przyznam, że jest to nieco poza przypadkiem użycia w OP, biorąc pod uwagę, że kodowanie base64 lub base58 byłoby najbardziej odpowiednie. Doszedłem do tego pytania na podstawie tytułu, dosłownie konwertując liczbę całkowitą na tekst ascii, tak jakby liczba całkowita miała dane zakodowane w ascii osadzone w swoich bajtach. Opublikowałem tę odpowiedź na wypadek, gdyby inni przybyli tutaj z takim samym pożądanym rezultatem.
Matthew Davis,
7

A co z kodowaniem BASE58 adresu URL? Tak jak na przykład 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

Przekształcenie tego z powrotem w liczbę też nie jest wielkim problemem.

Ivo Wetzel
źródło
2
To jest świetne. Skończyło się na tym, że znalazłem inną (bardziej kompletną) odpowiedź tutaj na SO: stackoverflow.com/questions/1119722/ ...
mlissner
-1

Użyj hex(id)[2:]i int(urlpart, 16). Istnieją inne opcje. kodowanie base32 również może działać, ale nie wiem, czy istnieje biblioteka, która obsługuje kodowanie base32 wbudowane w Python.

Najwyraźniej koder base32 został wprowadzony w Pythonie 2.4 z modułem base64 . Możesz spróbować użyć b32encodei b32decode. Powinieneś podać Trueobie opcje casefoldi map01na b32decodewypadek, gdyby ludzie zapisali twoje skrócone adresy URL.

Właściwie to cofam. Nadal uważam, że kodowanie base32 jest dobrym pomysłem, ale ten moduł nie jest przydatny w przypadku skracania adresu URL. Możesz spojrzeć na implementację w module i stworzyć własną dla tego konkretnego przypadku. :-)

Wszelaki
źródło