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

  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • jkimisyellow...ish

    jkimisyellow

    8 Temmuz 2009
  • STITCHLESS TV how to sew your own style tutorials

    STITCHLESS T

    9 HAZİRAN 2011