Converteer int naar ASCII en terug in Python

Ik ben bezig met het maken van een URL-verkorter voor mijn site, en mijn huidige plan (ik sta open voor suggesties) is om een node-ID te gebruiken om de verkorte URL te genereren. Dus in theorie zou knooppunt 26 short.com/zkunnen zijn, knooppunt 1 zou short.com/akunnen zijn, en knooppunt 52 zou short.com/Zen knooppunt 104 is mogelijk short.com/ZZ. Wanneer een gebruiker naar die URL gaat, moet ik het proces omkeren (uiteraard).

Ik kan een paar onhandige manieren bedenken om dit aan te pakken, maar ik vermoed dat er betere zijn. Suggesties?


Antwoord 1, autoriteit 100%

ASCII naar int:

ord('a')

geeft 97

En terug naar een string:

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

geeft 'a'


Antwoord 2, autoriteit 41%

>>> ord("a")
97
>>> chr(97)
'a'

Antwoord 3, autoriteit 5%

Als er meerdere karakters zijn gebonden binnen een enkel geheel getal/lang, zoals mijn probleem was:

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

Opbrengst '0123456789'en x = 227581098929683594426425L


Antwoord 4, autoriteit 3%

Hoe zit het met BASE58-codering van de URL? Zoals bijvoorbeeld flickr doet.

# 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

Het is ook niet erg om daar een getal van te maken.


Antwoord 5

Gebruik hex(id)[2:]en int(urlpart, 16). Er zijn andere opties. base32-codering van uw id zou ook kunnen werken, maar ik weet niet of er een bibliotheek is die base32-codering in Python heeft ingebouwd.

Blijkbaar is er een base32-encoder geïntroduceerd in Python 2.4 met de base64-module. Je zou kunnen proberen om b32encodeen b32decodete gebruiken. Geef Truevoor zowel de casefoldals map01opties aan b32decodevoor het geval mensen je verkorte URL’s opschrijven.

Eigenlijk neem ik dat terug. Ik denk nog steeds dat base32-codering een goed idee is, maar die module is niet handig in het geval van URL-verkorting. Je zou naar de implementatie in de module kunnen kijken en er zelf een maken voor dit specifieke geval. 🙂

Other episodes