2010-12-01 10 views
5

संभव डुप्लिकेट:
Why does base64 encoding requires padding if the input length is not divisible by 3?बेस 64 एन्कोडिंग में पैडिंग का उपयोग क्यों किया जाता है?

का हवाला देते हुए Wikipedia:

... इन गद्दी पात्रों तो जब डिकोडिंग खारिज कर दिया जाना चाहिए, लेकिन अभी भी की गणना की अनुमति देने के प्रभावी अनएन्डेड टेक्स्ट की लंबाई, जब इसकी इनपुट बाइनरी लंबाई 3 बाइट्स के एकाधिक नहीं होगी। ...

लेकिन पैडिंग चरित्र को पट्टी करने के बावजूद लंबाई कच्चे डेटा की गणना आसानी से की जा सकती है।

  |    Encoded 
      |-------------------------------------- 
Raw Size | Total Size | Real Size | Padding Size 
1   | 4   | 2   | 2 
2   | 4   | 3   | 1 
3   | 4   | 4   | 0 
4   | 8   | 6   | 2 
5   | 8   | 7   | 1 
6   | 8   | 8   | 0 
7   | 12   | 10  | 2 
8   | 12   | 11  | 1 
9   | 12   | 12  | 0 
10  | 16   | 14  | 2 
. 
. 
. 

तो असली इनकोडिंग आकार (तीसरे स्तंभ) आप हमेशा सही ढंग से अनुमान लगा सकते हैं क्या गद्देदार आकार होगा दिया:

PaddedSize = 4 * Ceil (RealSize/4) 

तो सिद्धांत रूप में, वहाँ गद्दी की कोई जरूरत नहीं थी। एल्गोरिदम ने इसे संभाला होगा। यह मानते हुए कि बेस 64 एन्कोडिंग एक लोकप्रिय उद्योग मानक है, इसका उपयोग कई अनुप्रयोगों और उपकरणों में किया जाता है। ये कम एन्कोडेड आकार से लाभान्वित होंगे। तो सवाल यह है कि बेस 64 एन्कोडिंग में पैडिंग का उपयोग क्यों किया जाता है?

+0

@ इग्नासिओ: यह प्रश्न * क्यों * समझाते हुए बहुत अच्छा नहीं है। – BastiBen

+0

मैंने सोचा कि कुछ डुप्लिकेशन की अनुमति है (http: //blog.stackoverflow।com/2010/11/dr-strangedupe-or-how-i-learn-to-stop-anxing-and-love-duplication /) जब तक सवाल में पर्याप्त जानकारी डाली गई थी और इसे विभिन्न परिप्रेक्ष्य से पूछा गया था। – Hemant

उत्तर

4

यह एन्कोडेड संदेश को 4 वर्णों का एक पूर्णांक एकाधिक बनाता है। यह एक डिकोडर को थोड़ा आसान लिख सकता है। आप 4 के ब्लॉक में वर्ण लोड और संसाधित कर सकते हैं और उन्हें 3 आउटपुट वर्णों में परिवर्तित कर सकते हैं, और पैडिंग स्ट्रिंग के अंत को बंद किए बिना ऐसा करना आसान बनाता है।

+1

जैसा कि सवाल में बताया गया है, आप केवल वास्तविक एन्कोडेड डेटा के आकार से पैडिंग वर्ण की संख्या की गणना कर सकते हैं। यदि आप इसे संसाधित करने से पहले चाहते हैं तो आप इसे जोड़ सकते हैं। वास्तव में तार पर उन्हें संचारित करने की कोई ज़रूरत नहीं है! – Hemant

+3

तार पर उन्हें प्रेषित करने की लागत बहुत छोटी है (प्रति संदेश 2 बाइट्स पर)। मुझे लगता है कि डिजाइनरों ने सोचा था कि इसे आसान बनाना (एन्कोडेड संदेश को अंत में एक चर-लंबाई ब्लॉक होने के बजाय 4-बाइट ब्लॉक का अनुक्रम बनाकर) थोड़ा अधिक कुशल बनाने से अधिक महत्वपूर्ण था। यदि आप बैंडविड्थ के बारे में चिंतित थे तो आप किसी भी सिस्टम को बेस 64 का उपयोग करने के लिए डिज़ाइन नहीं करेंगे। – Angus

+0

हमम ... मैं सादगी भाग से सहमत हूं! यह सिर्फ इतना है कि मैंने माना है कि पैडिंग की तकनीकी * आवश्यकता * होगी ... – Hemant

1

जैसा कि आप ध्यान देते हैं, संदेश की लंबाई के बावजूद एंड-पैडिंग लंबाई में अधिकतम 2 बाइट्स है, इसलिए यह वास्तव में महत्वपूर्ण बचत नहीं है - माइक्रो-ऑप्टिमाइज़ेशन का अधिक। यदि आपका एप्लिकेशन एन्कोडिंग के निर्माता और उपभोक्ता दोनों है, तो आप पैडिंग को तोड़ सकते हैं, लेकिन यह वास्तव में परेशानी के लायक नहीं है।

+1

यदि यह उसका उद्देश्य था, तो यह विश्वसनीय रूप से ऐसा करने में सक्षम होगा, और यह नहीं कर सकता है। – Angus

+2

हाँ, एक तिहाई मामलों में, मान्य बेस 64 एन्कोडेड स्ट्रिंग पैडिंग के साथ समाप्त नहीं होती है। – Hemant

+0

@ एंगस, हेमंत: अच्छा बिंदु, संपादित। – Piskvor

0

बेस 64 पुराना है और उन दिनों से आता है जहां उपलब्ध रैम और सीपीयू पर सीमाएं थीं। सॉफ़्टवेयर लिखना अधिक जटिल था (आज के एसडीके और टूलकिट 80s या 90s की तुलना में अधिक उपयोगकर्ता के अनुकूल हैं) और बेस 64 को कई अलग-अलग सिस्टम आर्किटेक्चर पर चलाना पड़ा।

उस ने कहा, डेवलपर यह मान सकता है कि बेस 64 डेटा को डीकोड करने के बाद "असली" डेटा लगभग n बाइट लंबा होगा; जिसने बदले में उसे बेहतर स्मृति प्रबंधन करने की अनुमति दी।

आज यह वास्तव में कोई फर्क नहीं पड़ता है, लेकिन उस दिन वापस जहां संसाधन सीमित थे, यह एक अच्छी बात थी।

अपडेट: कभी सोचा नहीं कि मुझे 5 साल बाद डाउनवोट मिलेगा, लेकिन अब मैं अपने जवाब के साथ समस्या देख सकता हूं। मुझे लगता है कि हम सभी बड़े हो जाते हैं। ;) प्रिय आगंतुक, नमक के अनाज के साथ इस जवाब का आनंद लें।

+0

डीकोडेड डेटा आकार (पहला कॉलम) की गणना करना * एन्कोडेड डेटा (तीसरा कॉलम) का उपयोग करके * बहुत * आसान है: 'प्रथम कॉलम = तीसरा कॉलम * 3/4' (मान लें' प्रथम कॉलम 'और' थर्ड कॉलम 'पूर्णांक चर। सरल पूर्णांक अंकगणित जैसा लगता है यह * किसी * मंच पर किया जा सकता है)! – Hemant

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