Converti int in ASCII e torna in Python


138

Sto lavorando per creare un accorciatore di URL per il mio sito e il mio piano attuale (sono aperto ai suggerimenti) è utilizzare un ID nodo per generare l'URL abbreviato. Quindi, in teoria, il nodo 26 potrebbe essere short.com/z, il nodo 1 potrebbe essere short.com/a, il nodo 52 potrebbe essere short.com/Ze il nodo 104 potrebbe essere short.com/ZZ. Quando un utente passa a quell'URL, devo invertire il processo (ovviamente).

Riesco a pensare ad alcuni modi sfacciati per farlo, ma immagino che ce ne siano di migliori. Eventuali suggerimenti?


possibile duplicato della conversione Base 62 in Python
mlissner

Risposte:


240

ASCII a int:

ord('a')

97

E torniamo a una stringa:

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

'a'


82
e solo chr () in python3!
Ehsan M. Kermani,

1
chr parole nell'intervallo dei caratteri ascii (0 - 255), tuttavia, unichr funziona per il set di caratteri unicode.
Shivendra Soni,


9

Se più caratteri sono associati all'interno di un singolo numero intero / lungo, come è stato il mio 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))

Resa '0123456789'ex = 227581098929683594426425L


2
Grazie per avermelo chiesto. Concederò che è leggermente fuori dal caso d'uso nell'OP, dato che la codifica base64 o base58 sarebbe più applicabile. Ero arrivato a questa domanda in base al titolo, convertendo letteralmente un numero intero in testo ASCII come se l'intero avesse codificato i dati ASCII incorporati nei suoi byte. Ho pubblicato questa risposta nel caso in cui altri arrivassero qui con lo stesso risultato desiderato.
Matthew Davis,

7

Che dire di BASE58 che codifica l'URL? Come ad esempio 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

Anche trasformarlo in un numero non è un grosso problema.


2
Questo è fantastico Ho finito per trovare un'altra risposta (più completo) qui su SO però: stackoverflow.com/questions/1119722/...
mlissner

-1

Usa hex(id)[2:]e int(urlpart, 16). Ci sono altre opzioni Anche la codifica base32 del tuo ID potrebbe funzionare, ma non so che ci sia alcuna libreria che esegua la codifica base32 integrata in Python.

Apparentemente un codificatore base32 è stato introdotto in Python 2.4 con il modulo base64 . Potresti provare a usare b32encodee b32decode. Dovresti dare Trueentrambe le opzioni casefolde nel caso in cui le persone scrivano i tuoi URL abbreviati.map01b32decode

In realtà, lo riprendo. Penso ancora che la codifica base32 sia una buona idea, ma quel modulo non è utile per il caso di abbreviazione di URL. Puoi guardare l'implementazione nel modulo e crearne uno tuo per questo caso specifico. :-)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.