Convierte int a ASCII y vuelve a Python

138

Estoy trabajando en hacer un acortador de URL para mi sitio, y mi plan actual (estoy abierto a sugerencias) es usar una ID de nodo para generar la URL acortada. Entonces, en teoría, el nodo 26 podría ser short.com/z, el nodo 1 podría ser short.com/a, el nodo 52 podría ser short.com/Zy el nodo 104 podría ser short.com/ZZ. Cuando un usuario accede a esa URL, necesito revertir el proceso (obviamente).

Puedo pensar en algunas maneras poco claras de hacer esto, pero supongo que hay mejores. ¿Alguna sugerencia?

mlissner
fuente
posible duplicado de conversión
mlissner

Respuestas:

240

ASCII a int:

ord('a')

da 97

Y de vuelta a una cadena:

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

da 'a'

Dominic Bou-Samra
fuente
82
y solo chr () en python3!
Ehsan M. Kermani
1
chr palabras en el rango de los caracteres ascii (0 - 255), sin embargo, unichr funciona para el conjunto de caracteres unicode.
Shivendra Soni
98
>>> ord("a")
97
>>> chr(97)
'a'
renatov
fuente
9

Si varios caracteres están unidos dentro de un solo entero / largo, como fue mi problema:

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

Rendimientos '0123456789'yx = 227581098929683594426425L

Matthew Davis
fuente
2
Gracias por preguntar. Le concederé que está ligeramente fuera del caso de uso en el OP, dado que la codificación base64 o base58 sería la más aplicable. Llegué a esta pregunta basándome en el título, literalmente convirtiendo un entero en texto ascii como si el entero tuviera datos codificados ascii incrustados en sus bytes. Publiqué esta respuesta en caso de que otros llegaran aquí con el mismo resultado deseado.
Matthew Davis el
7

¿Qué pasa con BASE58 que codifica la URL? Como por ejemplo flickr hace.

# 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

Convertir eso de nuevo en un número tampoco es un gran problema.

Ivo Wetzel
fuente
2
Esto es genial. Sin embargo, terminé encontrando otra respuesta (más completa) aquí en SO: stackoverflow.com/questions/1119722/…
mlissner
-1

Uso hex(id)[2:]y int(urlpart, 16). Hay otras opciones la codificación base32 de su identificación también podría funcionar, pero no sé si hay alguna biblioteca que codifique base32 integrada en Python.

Aparentemente, se introdujo un codificador base32 en Python 2.4 con el módulo base64 . Puede intentar usar b32encodey b32decode. Usted debe dar Truetanto para el casefoldy map01opciones para b32decodeen caso de que la gente escriba sus direcciones URL acortadas.

En realidad, lo retiro. Todavía creo que la codificación base32 es una buena idea, pero ese módulo no es útil para el caso del acortamiento de URL. Puede ver la implementación en el módulo y hacer la suya propia para este caso específico. :-)

De todo género
fuente