185 votes

Convertir int en ASCII et inversement en Python

Je travaille à la création d'un raccourcisseur d'URL pour mon site, et mon plan actuel (je suis ouvert aux suggestions) est d'utiliser un ID de nœud pour générer l'URL raccourci. Donc, en théorie, le nœud 26 pourrait être short.com/z le nœud 1 pourrait être short.com/a le nœud 52 peut être short.com/Z et le nœud 104 peut être short.com/ZZ . Lorsqu'un utilisateur se rend à cette URL, je dois inverser le processus (évidemment).

Je peux penser à des façons maladroites de procéder, mais je suppose qu'il y en a de meilleures. Vous avez des suggestions ?

315voto

Dominic Bou-Samra Points 4343

ASCII à int :

ord('a')

donne 97

Revenons à une chaîne de caractères :

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

donne 'a'

121voto

renatov Points 101
>>> ord("a")
97
>>> chr(97)
'a'

14voto

Matthew Davis Points 197

Si plusieurs caractères sont liés à l'intérieur d'un seul entier/long, comme c'était le cas pour moi :

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

Rendements '0123456789' y x = 227581098929683594426425L

8voto

Ivo Wetzel Points 27802

Qu'en est-il de l'encodage BASE58 de l'URL ? Comme le fait par exemple 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

Il n'est pas non plus très difficile de convertir ce chiffre en un nombre.

0voto

Omnifarious Points 25666

Utilisation hex(id)[2:] y int(urlpart, 16) . Il y a d'autres options. L'encodage base32 de votre identifiant pourrait également fonctionner, mais je ne sais pas s'il existe une bibliothèque qui fait de l'encodage base32 intégrée à Python.

Apparemment, un encodeur base32 a été introduit dans Python 2.4 avec l'option module base64 . Vous pouvez essayer d'utiliser b32encode y b32decode . Vous devez donner True pour les deux casefold y map01 options pour b32decode au cas où des personnes écriraient vos URL raccourcis.

En fait, je retire ce que j'ai dit. Je pense toujours que l'encodage base32 est une bonne idée, mais ce module n'est pas utile dans le cas d'un raccourcissement d'URL. Vous pouvez regarder l'implémentation dans le module et faire la vôtre pour ce cas spécifique :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X