संक्षिप्त जवाब
आपको किसी bytes-like
ऑब्जेक्ट ( bytes
और bytearray
, आदि) को base64.b64encode()
विधि पर धकेलने की आवश्यकता है । यहाँ दो तरीके हैं:
>>> data = base64.b64encode(b'data to be encoded')
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
या एक चर के साथ:
>>> string = 'data to be encoded'
>>> data = base64.b64encode(string.encode())
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
क्यों?
पायथन 3 में, str
ऑब्जेक्ट सी-स्टाइल कैरेक्टर एरेज़ नहीं हैं (इसलिए वे बाइट एरेज़ नहीं हैं ), बल्कि, वे डेटा स्ट्रक्चर्स हैं, जिनमें कोई अंतर्निहित एन्कोडिंग नहीं है। आप विभिन्न तरीकों से उस स्ट्रिंग (या उसकी व्याख्या कर सकते हैं) को एनकोड कर सकते हैं। सबसे आम (और पायथन 3 में डिफ़ॉल्ट) utf-8 है, खासकर जब से यह ASCII के साथ पीछे की ओर संगत है (हालांकि, जैसा कि सबसे व्यापक रूप से उपयोग किए गए एनकोडिंग हैं)। ऐसा तब होता है जब आप एक string
कॉल करते हैं और कॉल करते हैं.encode()
पर विधि को : पायथन स्ट्रिंग को utf-8 (डिफ़ॉल्ट एन्कोडिंग) में व्याख्या कर रहा है और आपको बाइट्स की सरणी प्रदान करता है जो इसके अनुरूप है।
बेस -64 पायथन 3 में एनकोडिंग
मूल रूप से प्रश्न शीर्षक ने बेस -64 एनकोडिंग के बारे में पूछा। बेस -64 सामान के लिए आगे पढ़ें।
base64
एन्कोडिंग 6-बिट बाइनरी विखंड लेता है और उन्हें AZ, az, 0-9, '+', '/', और '=' वर्णों का उपयोग करके एन्कोड करता है (कुछ एनकोडिंग '+' और '/' के स्थान पर विभिन्न वर्णों का उपयोग करते हैं) । यह एक कैरेक्टर एन्कोडिंग है जो कि मूलांक -64 या बेस -64 नंबर सिस्टम के गणितीय निर्माण पर आधारित है, लेकिन वे बहुत अलग हैं। गणित में आधार -64 द्विआधारी या दशमलव जैसी एक संख्या प्रणाली है, और आप मूलांक के इस परिवर्तन को पूरी संख्या पर करते हैं, या (यदि आप जिस मूलांक से परिवर्तित कर रहे हैं वह 64 से कम 2 की शक्ति है) दाईं ओर से विखंडू में बाएं।
में base64
एन्कोडिंग, अनुवाद बाएं से दाएं किया जाता है; वे पहले 64 वर्ण हैं, इसलिए इसे एन्कोडिंग कहा जाता हैbase64
। 65 वें '=' चिह्न का उपयोग पैडिंग के लिए किया जाता है, क्योंकि एन्कोडिंग 6-बिट चंक को खींचती है, लेकिन आमतौर पर इसे एन्कोड करने के लिए डेटा 8-बिट बाइट्स होते हैं, इसलिए कभी-कभी अंतिम चंक में केवल दो या 4 बिट होते हैं।
उदाहरण:
>>> data = b'test'
>>> for byte in data:
... print(format(byte, '08b'), end=" ")
...
01110100 01100101 01110011 01110100
>>>
यदि आप द्विआधारी डेटा को एक पूर्णांक के रूप में व्याख्या करते हैं, तो यह है कि आप इसे बेस -10 और बेस -64 ( बेस -64 के लिए तालिका ) में कैसे बदलेंगे :
base-2: 01 110100 011001 010111 001101 110100 (base-64 grouping shown)
base-10: 1952805748
base-64: B 0 Z X N 0
base64
एन्कोडिंग , हालांकि, इस डेटा को इस प्रकार फिर से समूहित करेगा:
base-2: 011101 000110 010101 110011 011101 00(0000) <- pad w/zeros to make a clean 6-bit chunk
base-10: 29 6 21 51 29 0
base-64: d G V z d A
तो, 'B0ZXN0' हमारे द्विआधारी, गणितीय रूप से बोलने का आधार -64 संस्करण है। हालांकि, base64
एन्कोडिंग को विपरीत दिशा में एन्कोडिंग करना पड़ता है (इसलिए कच्चे डेटा को 'dGVzdA' में बदल दिया जाता है) और अन्य अनुप्रयोगों को यह बताने का भी नियम है कि अंत में कितनी जगह बची है। यह '=' प्रतीकों के साथ अंत पैडिंग द्वारा किया जाता है। ऐसाbase64
इस डेटा का एन्कोडिंग 'dGVzdA ==' है, जिसमें दो 'बिट्स' को दर्शाने के लिए दो '=' प्रतीकों के साथ अंत से हटाए जाने की आवश्यकता होगी जब यह डेटा मूल डेटा से मेल खाने के लिए डिकोड हो जाता है।
आइए यह देखने के लिए परीक्षण करें कि क्या मैं बेईमान हूं:
>>> encoded = base64.b64encode(data)
>>> print(encoded)
b'dGVzdA=='
base64
एन्कोडिंग का उपयोग क्यों करें ?
मान लीजिए कि मुझे ईमेल के माध्यम से किसी को कुछ डेटा भेजना है, जैसे कि यह डेटा:
>>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20'
>>> print(data.decode())
>>> print(data)
b'\x04msg\x08\x08\x08 '
>>>
मेरे द्वारा लगाए गए दो समस्याएं हैं:
- अगर मैंने उस ईमेल को यूनिक्स में भेजने का प्रयास किया, तो
\x04
चरित्र पढ़ते ही ईमेल भेज दिया जाएगा , क्योंकि वह END-OF-TRANSMISSION
(Ctrl-D) के लिए ASCII है , इसलिए शेष डेटा ट्रांसमिशन से बाहर रह जाएगा।
- जब मैं डेटा को सीधे प्रिंट करता हूं, तो जब पायथन मेरे सभी बुरे नियंत्रण पात्रों से बचने के लिए पर्याप्त स्मार्ट होता है, जब उस स्ट्रिंग को ASCII के रूप में डिकोड किया जाता है, तो आप देख सकते हैं कि 'संदेश' नहीं है। ऐसा इसलिए है क्योंकि मैंने 'msg' को मिटाने के लिए तीन
BACKSPACE
वर्णों और तीन SPACE
वर्णों का उपयोग किया है । इस प्रकार, यहां तक कि अगर मेरे पास EOF
चरित्र नहीं था, तो अंतिम उपयोगकर्ता स्क्रीन पर पाठ से वास्तविक, कच्चे डेटा में अनुवाद करने में सक्षम नहीं होगा।
यह केवल यह दिखाने के लिए एक डेमो है कि केवल कच्चे डेटा को भेजना कितना कठिन हो सकता है। बेस 64 प्रारूप में डेटा को एन्कोड करने से आपको सटीक डेटा मिलता है लेकिन एक प्रारूप में यह सुनिश्चित करता है कि यह ईमेल जैसे इलेक्ट्रॉनिक मीडिया पर भेजने के लिए सुरक्षित है।