Konvertieren Sie int in ASCII und zurück in Python

137

Ich arbeite daran, einen URL-Shortener für meine Website zu erstellen. Mein aktueller Plan (ich bin offen für Vorschläge) besteht darin, eine Knoten-ID zum Generieren der verkürzten URL zu verwenden. Theoretisch könnte also Knoten 26 short.com/z, Knoten 1 short.com/a, Knoten 52 short.com/Zund Knoten 104 sein short.com/ZZ. Wenn ein Benutzer zu dieser URL geht, muss ich den Vorgang (offensichtlich) umkehren.

Ich kann mir einige klobige Wege vorstellen, um dies zu erreichen, aber ich vermute, es gibt bessere. Irgendwelche Vorschläge?

mlissner
quelle
Mögliches Duplikat der Base 62-Konvertierung in Python
mlissner

Antworten:

239

ASCII zu int:

ord('a')

gibt 97

Und zurück zu einer Zeichenfolge:

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

gibt 'a'

Dominic Bou-Samra
quelle
82
und nur chr () in python3!
Ehsan M. Kermani
1
chr Wörter im Bereich der ASCII-Zeichen (0 - 255), unichr funktioniert jedoch für den Unicode-Zeichensatz.
Shivendra Soni
98
>>> ord("a")
97
>>> chr(97)
'a'
Renatov
quelle
9

Wenn mehrere Zeichen in einer einzigen Ganzzahl / Länge gebunden sind, war dies mein Problem:

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

Erträge '0123456789'undx = 227581098929683594426425L

Matthew Davis
quelle
2
Danke für die Frage. Ich gebe zu, dass dies etwas vom Anwendungsfall im OP abweicht, da die Base64- oder Base58-Codierung am besten geeignet wäre. Ich war aufgrund des Titels zu dieser Frage gekommen und hatte eine Ganzzahl buchstäblich in ASCII-Text konvertiert, als ob die Ganzzahl ASCII-codierte Daten in ihre Bytes eingebettet hätte. Ich habe diese Antwort für den Fall gepostet, dass andere mit dem gleichen gewünschten Ergebnis hierher kamen.
Matthew Davis
7

Was ist mit BASE58, das die URL codiert? Wie zum Beispiel 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

Das wieder in eine Zahl umzuwandeln ist auch keine große Sache.

Ivo Wetzel
quelle
2
Das ist toll. Ich fand hier auf SO eine andere (vollständigere) Antwort: stackoverflow.com/questions/1119722/…
mlissner
-1

Verwenden Sie hex(id)[2:]und int(urlpart, 16). Es gibt andere Möglichkeiten. Die Base32-Codierung Ihrer ID könnte ebenfalls funktionieren, aber ich weiß nicht, dass es eine Bibliothek gibt, die die in Python integrierte Base32-Codierung ausführt.

Anscheinend wurde in Python 2.4 mit dem base64-Modul ein base32-Encoder eingeführt . Sie könnten versuchen, b32encodeund zu verwenden b32decode. Sie sollten Truesowohl die casefoldals auch die map01Optionen angeben, b32decodefalls Personen Ihre verkürzten URLs aufschreiben.

Eigentlich nehme ich das zurück. Ich denke immer noch, dass die Base32-Codierung eine gute Idee ist, aber dieses Modul ist für den Fall der URL-Verkürzung nicht nützlich. Sie können sich die Implementierung im Modul ansehen und Ihre eigene für diesen speziellen Fall erstellen. :-)

Allgegenwärtig
quelle