SORU
18 ŞUBAT 2009, ÇARŞAMBA


Nasıl Python ile url-güvenli en kısa dizeye bir tamsayı dönüştürmek için?

Bir URL bir tamsayı temsil eden mümkün olan en kısa şekilde istiyorum. Örneğin, 11234 '2be2' kullanarak onaltılık. kısaltılmış olabilir için Base64 kullanır 64 karakter kodlaması olduğundan, base64 bir tamsayı onaltılık daha az karakter kullanarak temsil etmek mümkün olmalıdır. Sorun base64 için bir tamsayı dönüştürmek için en temiz yol (tekrar) Python kullanarak çözemiyorum.

Base64 modülü bytestrings ile başa çıkmak için yöntemler vardır - belki bir çözüm Python bir dize olarak ikili gösterimi için bir tamsayı dönüştürmek için olmalı... ama bunu da yapmak için nasıl emin değilim.

CEVAP
18 ŞUBAT 2009, ÇARŞAMBA


Bu cevap Leeder, aşağıdaki değişiklikler ile Douglas ruhu benzer:

  • Gerçek doldurma karakter yok yani Base64, kullanmaz
  • Numarasını ilk byte-string (base 256) dönüştürmek yerine, doğrudan negatif sayıların işareti karakteri kullanarak temsil izin avantajı olan 64, tabanına dönüştürür.

    import string
    ALPHABET = string.ascii_uppercase   string.ascii_lowercase   \
               string.digits   '-_'
    ALPHABET_REVERSE = dict((c, i) for (i, c) in enumerate(ALPHABET))
    BASE = len(ALPHABET)
    SIGN_CHARACTER = '$'
    
    def num_encode(n):
        if n < 0:
            return SIGN_CHARACTER   num_encode(-n)
        s = []
        while True:
            n, r = divmod(n, BASE)
            s.append(ALPHABET[r])
            if n == 0: break
        return ''.join(reversed(s))
    
    def num_decode(s):
        if s[0] == SIGN_CHARACTER:
            return -num_decode(s[1:])
        n = 0
        for c in s:
            n = n * BASE   ALPHABET_REVERSE[c]
        return n
    

    >>> num_encode(0)
    'A'
    >>> num_encode(64)
    'BA'
    >>> num_encode(-(64**5-1))
    '$_____'

Birkaç yan notlar:

  • (marjinal) dize koyarak base-64 sayıların insan- ± artar.basamak ilk alfabesi ve işaret karakteri'); Python urlsafe_b64encode. dayalı yaptığım sipariş seçtim ' - yapma
  • Eğer negatif sayılar bir sürü kodlama yapıyorsanız, bir işaret kullanarak verimliliğini artırabilir bit veya bir iki işareti bir karakter yerine tamamlıyor.
  • Kolayca alfabeyi değiştirerek farklı üsleri için bu kodu uyarlamak mümkün, ya da alfasayısal karakterler veya ek eklemek için "URL-güvenli" bir karakter. sadece onu kısıtlamak gerekir
  • Tavsiye ederimkarşıbir temsili URI çoğu durumlarda—bu karmaşıklık ekler ve daha önemli bir tasarruf HTTP sürece yükü oranla olmadan hata ayıklama yapar 10 tabanı dışında kullanarak bir şey için Küçücük-vari gidiyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kanaal van Dj0fifty

    Kanaal van D

    28 EKİM 2011
  • hoorahjencar

    hoorahjencar

    6 HAZİRAN 2007
  • Virtual Riot

    Virtual Riot

    19 Mayıs 2011