İnt'i ASCII'ye ve geri Python'a dönüştürme


138

Sitem için bir URL kısaltması yapmaya çalışıyorum ve mevcut planım (önerilere açıkım) kısaltılmış URL'yi oluşturmak için bir düğüm kimliği kullanmaktır. Yani, teorik olarak, düğüm 26 olabilir short.com/z, düğüm 1 olabilir short.com/a, düğüm 52 olabilir short.com/Zve düğüm 104 olabilir short.com/ZZ. Bir kullanıcı bu URL'ye gittiğinde, işlemi tersine çevirmem gerekir (açıkçası).

Bununla ilgili bazı küfürlü yollar düşünebilirim, ama daha iyi olanlar olduğunu tahmin ediyorum. Baska öneri?


Yanıtlar:


240

İnt için ASCII:

ord('a')

verir 97

Ve bir dizeye geri dönelim:

  • Python2'de: str(unichr(97))
  • Python3'te: chr(97)

verir 'a'


82
ve sadece python3'te chr ()!
Ehsan M. Kermani

1
Ancak, ascii karakterleri aralığında (0 - 255) chr kelimeleri, unichr unicode karakter kümesi için çalışır.
Shivendra Soni


9

Benim sorunum gibi tek bir tamsayı / uzun içinde birden çok karakter bağlıysa:

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

Verim '0123456789'vex = 227581098929683594426425L


2
Sorduğunuz için teşekkürler. Base64 veya base58 kodlamasının en uygun olacağı göz önüne alındığında, OP'deki kullanım durumunun biraz dışında olduğunu kabul edeceğim. Bu soruya tam olarak ascii metnine tamsayı baytlarında gömülü ascii kodlanmış veri varmış gibi dönüştürerek başlığa dayanarak gelmiştim. Bu yanıtı, başkalarının aynı istenen sonuçla buraya gelmesi durumunda gönderdim.
Matthew Davis

7

URL'yi kodlayan BASE58 ne olacak? Mesela flickr yapar.

# 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

Bunu bir sayıya çevirmek de önemli bir şey değil.


2
Bu harika. Burada SO olsa başka (daha eksiksiz) bir cevap bulmak sona erdi: stackoverflow.com/questions/1119722/…
mlissner

-1

Kullanım hex(id)[2:]ve int(urlpart, 16). Başka seçenekler de var. id32 kodlama base32 de işe yarayabilir, ancak Python içine yerleşik base32 kodlama yapan herhangi bir kütüphane olduğunu bilmiyorum.

Görünüşe göre Python 2.4'te base64 modülü ile bir base32 kodlayıcı tanıtıldı . Sen kullanmayı deneyebilirsiniz b32encodeve b32decode. Sen vermeli Trueikisi için casefoldve map01seçenekler b32decodeinsanların kısaltılmış URL'ler yazmak durumda.

Aslında, onu geri alıyorum. Hala base32 kodlamanın iyi bir fikir olduğunu düşünüyorum, ancak bu modül URL kısaltma için yararlı değildir. Modüldeki uygulamaya bakabilir ve bu özel durum için kendinizinkini yapabilirsiniz. :-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.