2012-04-26 9 views
7

त्वरित प्रश्न। मैं ऊपरी और निचले केस अक्षरों का उपयोग कर संख्याओं की एक स्ट्रिंग को छोटा करने के लिए पायथन में एक एन्कोडर खोजने या लिखने की कोशिश कर रहा हूं। संख्यात्मक तार कुछ इस तरह दिखते हैं:एक संख्यात्मक स्ट्रिंग को एक छोटी अल्फान्यूमेरिक स्ट्रिंग में एन्कोड करना, और फिर

20120425161608678259146181504021022591461815040210220120425161608667 

लंबाई हमेशा समान होती है।

मेरे प्रारंभिक सोचा इस स्ट्रिंग कुछ है कि अधिक इस तरह दिखता में छोटा करने के लिए अपर और लोअर केस अक्षरों और संख्याओं का उपयोग करने के लिए कुछ सरल एनकोडर लिखा था:

a26Dkd38JK 

कि पूरी तरह से मनमाने ढंग से किया गया था, सिर्फ बनने की कोशिश कर जितना संभव हो उतना स्पष्ट करें। मुझे यकीन है कि ऐसा करने के लिए वास्तव में एक शानदार तरीका है, शायद पहले से ही बनाया गया है। शायद यह पूछने के लिए एक शर्मनाक सवाल है।

इसके अलावा, मुझे छोटी स्ट्रिंग लेने और इसे लंबे संख्यात्मक मान में बदलने में सक्षम होना चाहिए। क्या मुझे कुछ लिखना चाहिए और कोड पोस्ट करना चाहिए, या क्या यह एक लाइन है जो पाइथन के फ़ंक्शन में बनाई गई है जिसे मुझे पहले से ही पता होना चाहिए?

धन्यवाद!

import base64 

def num_to_alpha(num): 
    num = hex(num)[2:].rstrip("L") 

    if len(num) % 2: 
     num = "0" + num 

    return base64.b64encode(num.decode('hex')) 

यह पहली बार एक bytestring में पूर्णांक बदल जाता है और उसके बाद बेस 64 वह कूटबद्ध:

+4

[बेस 64] (http://docs.python.org/library/base64.html) – JBernardo

+0

जेबर्नर्डो ने इसे दबाया। इसे एक उत्तर के रूप में पोस्ट करें :) !! –

+0

यह एक अच्छी बात है जिसे आप स्वयं कोड लिखने और इसे यहां पोस्ट करने की पेशकश कर रहे हैं। – Julian

उत्तर

10

यह एक बहुत अच्छी संपीड़न है। यहाँ विकोडक है:

def alpha_to_num(alpha): 
    num_bytes = base64.b64decode(alpha) 
    return int(num_bytes.encode('hex'), 16) 

उदाहरण:

>>> num_to_alpha(20120425161608678259146181504021022591461815040210220120425161608667) 
'vw4LUVm4Ea3fMnoTkHzNOlP6Z7eUAkHNdZjN2w==' 
>>> alpha_to_num('vw4LUVm4Ea3fMnoTkHzNOlP6Z7eUAkHNdZjN2w==') 
20120425161608678259146181504021022591461815040210220120425161608667 
+0

+1।ध्यान दें कि यह एक int लेता है, स्ट्रिंग –

+0

ऐसा लगता है कि यह बहुत अच्छा काम करता है। वास्तव में जो मैं खोज रहा था, धन्यवाद। आरई: int बनाम स्ट्रिंग: इस फ़ंक्शन में एक स्ट्रिंग पास करना वास्तव में काम नहीं करता है। यह एक int होना चाहिए। अच्छा कार्य! –

+0

इसके लिए मनमानी-परिशुद्धता पूर्णांक की आवश्यकता होती है, जो कि सौभाग्य से अजगर है। – ninjagecko

0
>>> s="20120425161608678259146181504021022591461815040210220120425161608667" 
>>> import base64, zlib 
>>> base64.b64encode(zlib.compress(s)) 
'eJxly8ENACAMA7GVclGblv0X4434WrKFVW5CtJl1HyosrZKRf3hL5gLVZA2b' 
>>> zlib.decompress(base64.b64decode(_)) 
'20120425161608678259146181504021022591461815040210220120425161608667' 

तो zlib असली अंक :(

6

दो कार्यों कि कस्टम रहे हैं के तार को संपीड़ित करने पर स्मार्ट (नहीं नहीं है base64 पर आधारित), लेकिन छोटे आउटपुट का उत्पादन:

chrs = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 
l = len(chrs) 

def int_to_cust(i): 
    result = '' 
    while i: 
     result = chrs[i % l] + result 
     i = i // l 
    if not result: 
     result = chrs[0] 
    return result 

def cust_to_int(s): 
    result = 0 
    for char in s: 
     result = result * l + chrs.find(char) 
    return result 

और परिणाम हैं:

>>> int_to_cust(20120425161608678259146181504021022591461815040210220120425161608667) 
'9F9mFGkji7k6QFRACqLwuonnoj9SqPrs3G3fRx' 
>>> cust_to_int('9F9mFGkji7k6QFRACqLwuonnoj9SqPrs3G3fRx') 
20120425161608678259146181504021022591461815040210220120425161608667L 

आप भी उत्पन्न स्ट्रिंग छोटा कर सकते हैं अगर आप chrs चर करने के लिए अन्य पात्रों जोड़ें।

+0

मुझे लगता है कि आप lib का उपयोग करने के बजाय स्वयं 64 एन्कोडिंग कर रहे हैं। –

+1

@ पॉलहॉंग: मुझे लगता है कि आपका अनुमान गलत है। मैंने फ़ंक्शन प्रस्तुत किया जो समान तरीके से काम करता है, लेकिन 1) पैडिंग की आवश्यकता के बिना (नाइटक्रैकर के उत्तर से '=' s को हटाने का प्रयास करें), 2) परिवर्तित मूल्य का प्रतिनिधित्व करने के लिए उपयोग किए जाने वाले अपने वर्णों को परिभाषित करने की क्षमता के साथ। जिस तरह से यह काम करता है वह बेस 64 के समान है, लेकिन यह बेस 64 नहीं है। शायद ऐसा कुछ करने के लिए एक लाइब्रेरी है, लेकिन यह नहीं मिला कि यह कौन सा है। – Tadeck

+0

मुझे वास्तव में यह समाधान पसंद है। विभिन्न सुझाए गए समाधानों के साथ खेलने में, मुझे यह सबसे अच्छा लगता है क्योंकि मैं इसे केवल अक्षरों और संख्याओं तक सीमित कर सकता हूं और भविष्य में और अधिक वर्ण जोड़ने पर नियंत्रण रख सकता हूं। अच्छी तरह से किया। –

संबंधित मुद्दे