बेस 64 एन्कोडेड स्ट्रिंग में अंत में एक = चिन्ह क्यों होता है


321

मुझे पता है कि base64एन्कोडिंग क्या है और base64सी # में एन्कोडिंग की गणना कैसे करें , हालांकि मैंने कई बार देखा है कि जब मैं एक स्ट्रिंग को बेस 64 में परिवर्तित करता हूं, =तो अंत में एक होता है।

कुछ सवाल उठे:

  1. क्या एक base64तार हमेशा साथ रहता है =?
  2. एक =अंत में क्यों जोड़ा जाता है?

9
इसका C # से कोई लेना-देना नहीं है।
BoltClock

19
वास्तव में यह c # से संबंधित है, सभी भाषाओं में = शामिल नहीं होगा, उदाहरण के लिए कई पर्ल लाइब्रेरी = को छोड़ दें, तो उपयोगकर्ता जिस पर्यावरण का उपयोग कर रहा है, वह वास्तव में प्रासंगिक है।
याकूब

यह इस तरह का लगता है कि यह कुछ मामलों में इसे कम करने की प्रभावी विधि बनाता है क्योंकि यह काफी पता लगाने योग्य है।
dgo

6
@ user1167442 Base64 आक्षेप के लिए नहीं है। यह एक स्ट्रिंग के रूप में बाइनरी डेटा (या यूनिकोड और अन्य विशेष वर्णों के साथ तार) के परिवहन के लिए है।
एनएच।

जवाबों:


269

यह पैडिंग का काम करता है ।

एक अधिक पूर्ण उत्तर यह है कि एक बेस 64 एनकोडेड स्ट्रिंग हमेशा एक के साथ समाप्त नहीं होता है =, यह केवल एक या दो के साथ समाप्त होगा =यदि उन्हें स्ट्रिंग को उचित लंबाई तक पैड करने की आवश्यकता होती है।


3
"एक केस जिसमें पेडिंग कैरेक्टर्स की आवश्यकता होती है, वह कई बेस 64 एनकोडेड फाइलों को समेट रहा है।"
एंड्रे प्यूएल

1
@ AndréPuel: resynch एक एकल =पर्याप्त होगा। यदि आप सीमाओं को वापस खोजना चाहते हैं, तो एक टर्मिनेटर हमेशा मौजूद होना चाहिए (और अभी भी केवल एक चार्ट की आवश्यकता है)। बेस 64 की पूरी पैडिंग कॉन्सेप्ट सिर्फ एक दिमाग की उपज है ...
6502

5
यह लिंक बेस 64 के लिए पूरी तरह अप्रासंगिक है, हालांकि।
एनएच।

1
मैं बस एक प्रासंगिक और विश्वसनीय लिंक पोस्ट करना चाहता हूं जो base64चित्र और उदाहरणों के साथ कुशलता से पैडिंग के बारे में बताता है । विकिपीडिया का वर्तमान लिंक @NH की तरह बिलकुल अप्रासंगिक है। उल्लेख किया।
Fr0zenFyr

1
@ Fr0zenFyr यदि आप एक लिंक चाहते हैं, तो en.wikipedia.org/wiki/Base64#Output_padding बहुत अच्छा है। लेकिन बद्र का जवाब वास्तव में एक बेहतर है (यह अभी तक वोट में नहीं पकड़ा गया है)।
एनएच।

312

1-नहीं

2- संक्षिप्त उत्तर के रूप में: 65 वें वर्ण ("=" चिह्न) का उपयोग केवल संदेश को एन्कोडिंग की अंतिम प्रक्रिया में पूरक के रूप में किया जाता है।

यदि आपके स्ट्रिंग में 3 वर्णों की संख्या है, तो आपके पास '=' चिन्ह नहीं होगा, क्योंकि Base64एन्कोडिंग प्रत्येक तीन बाइट्स (8 बिट्स) को लेती है और उन्हें ASCII मानक में चार मुद्रण योग्य वर्णों के रूप में दर्शाती है ।

विवरण :

(ए) यदि आप सांकेतिक शब्दों में बदलना चाहते हैं

ABCDEFG <=> [ ABC] [ DEF] [G

Base64पहला ब्लॉक और दूसरा (जैसा कि वे पूर्ण होते हैं) के साथ (4 वर्णों का निर्माण) करेंगे, लेकिन तीसरे के लिए यह ==4 आवश्यक वर्णों को पूरा करने के लिए आउटपुट में एक डबल जोड़ देगा। इसके अलावा , परिणाम QUJD REVG Rw होगा == (बिना स्थान के)

(बी) यदि आप सांकेतिक शब्दों में बदलना चाहते हैं ...

ABCDEFGH <=> [ ABC] [ DEF] [GH

इसी तरह, यह =4 अक्षरों को प्राप्त करने के लिए आउटपुट के अंत में सिर्फ एक जोड़ देगा , परिणाम QUJD REVG R0g = (स्थान के बिना) होगा


26
यह अन्य उत्तर और यहां तक ​​कि विकिपीडिया की तुलना में अधिक पूर्ण और स्पष्ट है और स्वीकृत उत्तर की तुलना में अधिक वोट के लायक होना चाहिए जो विकिपीडिया लिंक के अलावा कुछ भी नहीं करता है। आप के लिए यश! Upvoted!
ANGGuyInTown

2
@ANewGuyInTown विकिपीडिया लिंक स्वीकृत समाधान में गलत है, इसका आधार 64 पर पैडिंग से कोई लेना-देना नहीं है। सही पृष्ठ लेगोलस द्वारा अपने उत्तर में नीचे दिया गया था
Fr0zenFyr


66

से विकिपीडिया :

अंतिम '==' अनुक्रम इंगित करता है कि अंतिम समूह में केवल एक बाइट शामिल है, और '=' इंगित करता है कि इसमें दो बाइट्स थे।

इस प्रकार, यह कुछ प्रकार की गद्दी है।


16
  1. नहीं।
  2. Base64- एन्कोडेड स्ट्रिंग को लंबाई में 4 वर्णों के कई पर पैड करने के लिए, ताकि इसे सही ढंग से डिकोड किया जा सके।

3
मैंने =अंत में हटा दिया और 1 मिलियन स्ट्रिंग्स के लिए यह परीक्षण किया। डिकोडिंग हमेशा मेल खाता था।
vivek_23

15

इसकी RFC 2045 में एक विशेष पैडिंग कैरेक्टर के रूप में परिभाषित किया गया है यदि 24 बिट्स कम एन्कोडेड डेटा के अंत में उपलब्ध हैं।


11

आधार चिन्ह (=) का उपयोग बेस 64 एनकोडिंग के कुछ रूपों में पैडिंग के रूप में किया जाता है। विकिपीडिया लेख बेस 64 पर सभी विवरण है।


2
क्या आप तर्क दे सकते हैं कि "==" 1 बाइट क्यों है और "=" 2 बाइट्स है? मैं इसे समझ नहीं सकता। कैसे इनपुट आते हैं: "किसी भी कार्मिक आनंद।" "YW55IGNhcm5hbCBwbGVhc3VyZS4 =" परिणाम प्राप्त कर सकता है, जबकि "कोई भी वैवाहिक सुख" "YW55IGNhcm5hbCBwbGV3cyVQ ==" परिणाम प्राप्त कर सकता है?
नल

14
ऐसा नहीं है कि '==' 1 बाइट है और '=' 2 बाइट्स है। यह ऐसा मामला है कि आपको अपने पूरे स्ट्रिंग में हमेशा 4 से अधिक बाइट्स की आवश्यकता होती है। इसलिए आप '=' संकेतों के साथ पैड करें जब तक कि आपको वह नहीं मिल जाता। पहले स्ट्रिंग में दूसरी स्ट्रिंग की तुलना में एक अधिक चरित्र होता है, इसलिए पैडिंग के एक कम '=' की आवश्यकता होती है।
सैम होलोवे

2
क्या यह उत्तर एक टिप्पणी है?
Fr0zenFyr

9

यह पैडिंग है। से http://en.wikipedia.org/wiki/Base64 :

सिद्धांत रूप में, डिकोडिंग चरित्र को डिकोडिंग के लिए आवश्यक नहीं है, क्योंकि लापता बाइट्स की संख्या की गणना बेस 64 अंकों की संख्या से की जा सकती है। कुछ कार्यान्वयन में, पेडिंग चरित्र अनिवार्य है, जबकि अन्य के लिए इसका उपयोग नहीं किया जाता है। एक केस जिसमें पेडिंग कैरेक्टर्स की आवश्यकता होती है, वह कई बेस 64 एनकोडेड फाइलों को समेट रहा है।


1
भाग के बारे में "एक मामला जिसमें पैडिंग पात्रों की आवश्यकता होती है, वह कई बेस 64 एन्कोडेड फ़ाइलों को समेट रहा है।" गलत है। उदाहरण के लिए, जब दो बेस 64 फाइलें समेटती हैं, जहां प्रत्येक फाइल के लिए स्रोत बाइट्स 3 बाइट्स होती है, बेस 64 स्ट्रिंग्स 4 अक्षर लंबे होंगे और कोई पैडिंग बाइट नहीं होगी। जब आप इन दो बेस 64 स्ट्रिंग्स को समेटते हैं, तो यह बताने का कोई तरीका नहीं होगा कि कोई कहां से शुरू होता है और एक कॉन्टेक्टेड स्ट्रिंग पर आधारित सॉली को रोकता है। तो आधार 64 पैडिंग पर निर्भर रहने से उस काम में मदद नहीं मिलेगी। यह समस्या बाइट की लंबाई वाली किसी भी फ़ाइल के लिए समान रूप से 3 से मौजूद होगी।
रॉन सी

1
मुझे लगता है कि इसका मतलब उस मामले से है जहां अंतिम परिणाम आदानों का संयोजन होना चाहिए। जैसे decode(encode(A)+encode(B))=A+Bपैडिंग के साथ काम करता है लेकिन बिना नहीं।
थॉमस लियोनार्ड

शायद लेकिन इस तरह के सीमित उपयोग पैडिंग चार (ओं) को एन्कोडेड स्ट्रिंग्स को अलग करने के सामान्य मामले पर निर्भर होने की अनुमति नहीं देता है जब एन्कोडेड स्ट्रिंग्स को एक साथ समेटा जाता है। मैं केवल डेवलपर्स की मदद करने के लिए इसका उल्लेख करता हूं जो सोच रहे होंगे कि वे इसे इस तरह से उपयोग कर सकते हैं।
रॉन सी

1
मुझे लगता है कि आपकी आपत्ति वास्तव में सिर्फ गद्दी और परिसीमन की अवधारणाओं के बीच के अंतर को उजागर करती है। संघनन के परिणामों को आम तौर पर प्रत्यावर्ती बनाने के लिए पर्याप्त जानकारी शामिल करने की उम्मीद नहीं की जाती है। आपको नहीं पता होगा कि "c3dpenpsZXJz" मूल रूप से "c3dpenps" + "ZXJz" या "c3dp" + "enpsZXJz" है। लेकिन आपको यह भी पता नहीं है कि "स्विज़लर" मूल रूप से "स्विजी" + "ज़ेज़लर" या "स्विज़ल" + "आईर्स" हैं।
गर्गानुचेट

1
संबंधित बेस 64 पेडिंग उत्तर से मेरी टिप्पणी की नकल करना :> बेस 64 कॉन्सेप्टेशन [के साथ '=' पैडिंग] एनकोडर को बड़े आकार के चुंक को तीन के एक से अधिक के साथ संरेखित करने के बोझ के बिना समानांतर में संसाधित करने की अनुमति देता है। इसी तरह, एक कार्यान्वयन विवरण के रूप में, वहाँ एक एनकोडर हो सकता है जो एक आकार के आंतरिक डेटा बफर को फ्लश करने की आवश्यकता है जो तीन में से एक से अधिक नहीं है।
आंद्रे डी

7

http://www.hcidata.info/base64.htm

बेस 64 के लिए "मैरी के पास" एन्कोडिंग था

इस उदाहरण में हम एक साधारण पाठ स्ट्रिंग ("मैरी है") का उपयोग कर रहे हैं, लेकिन सिद्धांत कोई बात नहीं रखता है कि डेटा क्या है (जैसे ग्राफिक्स फ़ाइल)। आउटपुट डेटा के प्रत्येक 24 बिट्स को आउटपुट के 32 बिट्स में बदलने के लिए, बेस 64 एन्कोडिंग 24 बिट्स को 6 बिट्स के 4 भाग में विभाजित करता है। पहली समस्या जो हम देखते हैं कि "मैरी के पास" 3 बाइट्स से अधिक नहीं है - यह 8 बाइट्स लंबा है। इस वजह से, बिट्स का अंतिम समूह केवल 4 बिट्स लंबा है। इसे मापने के लिए हम '0' के दो अतिरिक्त बिट्स जोड़ते हैं और अंत में '=' ​​डालकर इस तथ्य को याद करते हैं। यदि पाठ स्ट्रिंग को बेस 64 में परिवर्तित किया जाना 7 बाइट्स लंबा था, तो अंतिम समूह में 2 बिट्स होंगे। इस मामले में हमने '0' के चार अतिरिक्त बिट्स जोड़े होंगे और अंत में '==' डालकर इस तथ्य को याद रखेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.