Convertir int en ASCII et revenir en Python

138

Je travaille sur la création d'un raccourcisseur d'URL pour mon site, et mon plan actuel (je suis ouvert aux suggestions) est d'utiliser un identifiant de nœud pour générer l'URL raccourcie. 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 pourrait être short.com/Zet le nœud 104 pourrait être short.com/ZZ. Lorsqu'un utilisateur accède à cette URL, je dois inverser le processus (évidemment).

Je peux penser à des moyens simples pour y parvenir, mais je suppose qu'il y en a de meilleurs. Aucune suggestion?

mlissner
la source
duplication possible de la conversion Base 62 en Python
mlissner

Réponses:

240

ASCII à int:

ord('a')

donne 97

Et revenons à une chaîne:

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

donne 'a'

Dominique Bou-Samra
la source
82
et juste chr () en python3!
Ehsan M. Kermani
1
mots chr dans la plage des caractères ascii (0 - 255), cependant, unichr fonctionne pour le jeu de caractères unicode.
Shivendra Soni
98
>>> ord("a")
97
>>> chr(97)
'a'
Renatov
la source
9

Si plusieurs caractères sont liés à l'intérieur d'un seul entier / long, comme ce fut mon problème:

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'etx = 227581098929683594426425L

Matthew Davis
la source
2
Merci d'avoir posé la question. J'accorde que c'est légèrement hors du cas d'utilisation dans l'OP, étant donné que l'encodage base64 ou base58 serait le plus applicable. J'étais arrivé sur cette question basée sur le titre, convertissant littéralement un entier en texte ascii comme si l'entier avait des données encodées ascii incorporées dans ses octets. J'ai posté cette réponse au cas où d'autres seraient arrivés ici avec le même résultat souhaité.
Matthew Davis
7

Qu'en est-il de l'encodage BASE58 de l'URL? Comme par exemple, flickr le fait.

# 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

Transformer cela en un nombre n'est pas non plus un gros problème.

Ivo Wetzel
la source
2
C'est bien. J'ai fini par trouver une autre réponse (plus complète) ici sur SO: stackoverflow.com/questions/1119722/…
mlissner
-1

Utilisez hex(id)[2:]et int(urlpart, 16). Il existe 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 l'encodage base32 intégré à Python.

Apparemment, un encodeur base32 a été introduit dans Python 2.4 avec le module base64 . Vous pouvez essayer d'utiliser b32encodeet b32decode. Vous devriez donner Trueà la fois les options casefoldet map01au b32decodecas où les gens écrivent vos URL raccourcies.

En fait, je reprends ça. Je pense toujours que l'encodage base32 est une bonne idée, mais ce module n'est pas utile dans le cas du raccourcissement d'URL. Vous pouvez regarder l'implémentation dans le module et créer la vôtre pour ce cas spécifique. :-)

Très varié
la source