web-dev-qa-db-fra.com

Convertissez int en ASCII et retournez en Python

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

Je peux penser à des moyens peu scrupuleux de s'y prendre, mais j'imagine qu'il en existe de meilleurs. Aucune suggestion?

120
mlissner

ASCII à int:

ord('a')

donne 97

Et revenons à une chaîne:

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

donne 'a'

209
Dominic Bou-Samra
>>> ord("a")
97
>>> chr(97)
'a'
82
renatov

Si plusieurs caractères sont liés dans 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))

Rend '0123456789' et x = 227581098929683594426425L

7
Matthew Davis

Qu'en est-il de BASE58 codant l'URL? Comme 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

Remettre cela dans un nombre n'est pas une grosse affaire non plus.

6
Ivo Wetzel