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?


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'


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


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


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.