दिलचस्प पोस्ट
Android में "@ आईडी /" और "@ + id /" के बीच अंतर मैं jQuery का उपयोग कर सीएसएस वर्ग के नियमों को कैसे बदल सकता हूं? एक फ़ाइल को सुरक्षित रूप से लिखने के लिए पायथन मल्टीप्रोसेसिंग JSlint त्रुटि 'एक लूप के भीतर कार्य न करें।' केवल जावास्क्रिप्ट के बारे में प्रश्न करता है MySQL में एक को छोड़कर सभी कॉलम का चयन करें? धागा को क्या मतलब है? तत्व की पैरेंट डिविज़ प्राप्त करना PHP की मौत की सफेद स्क्रीन ऐड डीबग में है, तो क्यों Gradle रिलीज़ मोड में मेरे मॉड्यूल का निर्माण करता है समाधान करने के लिए वेबपैक के साथ पथ की आवश्यकता है जावा: System.out.println और System.err.println क्रम से बाहर जावास्क्रिप्ट का उपयोग करके एंड्रॉइड वर्चुअल कीबोर्ड पर टाइप की गई कुंजी कैप्चर करें मैं जावा स्टैक ट्रेस डंप की प्रदर्शित लाइनों की संख्या कैसे बढ़ाऊं? आईबीओटलेट और आईबीएसीएशन सूची आइटम को कॉलम के रूप में कैसे प्रदर्शित किया जाए?

Base64 के साथ एक पायथन स्ट्रिंग को एन्कोड करने के लिए मुझे 'बी' की आवश्यकता क्यों है?

इस अजगर उदाहरण के बाद, मैं बेस 64 के साथ एक स्ट्रिंग सांकेतिक शब्दों में बदलना:

>>> import base64 >>> encoded = base64.b64encode(b'data to be encoded') >>> encoded b'ZGF0YSB0byBiZSBlbmNvZGVk' 

लेकिन, अगर मैं प्रमुख b छोड़ देता हूं:

 >>> encoded = base64.b64encode('data to be encoded') 

मुझे निम्नलिखित त्रुटि मिलती है:

 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python32\lib\base64.py", line 56, in b64encode raise TypeError("expected bytes, not %s" % s.__class__.__name__) TypeError: expected bytes, not str 

ऐसा क्यों है?

वेब के समाधान से एकत्रित समाधान "Base64 के साथ एक पायथन स्ट्रिंग को एन्कोड करने के लिए मुझे 'बी' की आवश्यकता क्यों है?"

बेस 64 एन्कोडिंग 8-बिट बाइनरी बाइट डेटा लेता है और एन्कोड करता है कि यह केवल AZ , az , 0-9 , + , / * वर्णों का उपयोग करता है, इसलिए यह उन चैनलों पर प्रसारित किया जा सकता है जो सभी 8-बिट डेटा को सुरक्षित नहीं रखता है, जैसे कि ईमेल

इसलिए, यह 8-बिट बाइट्स की एक स्ट्रिंग चाहता है। आप उन पायथन 3 में बनाते हैं जो b'' वाक्यविन्यास के साथ होते हैं।

यदि आप b निकाल देते हैं, तो यह एक स्ट्रिंग बन जाती है। एक स्ट्रिंग यूनिकोड वर्णों का अनुक्रम है। बेस 64 को पता नहीं है कि यूनिकोड डेटा के साथ क्या करना है, यह 8-बिट नहीं है यह वास्तव में कोई बिट नहीं है, वास्तव में 🙂

आपके दूसरे उदाहरण में:

 >>> encoded = base64.b64encode('data to be encoded') 

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

 >>> encoded = 'data to be encoded'.encode('ascii') 

या सरल:

 >>> encoded = b'data to be encoded' 

जो इस मामले में एक ही बात होगी।


* अधिकांश बेस 64 स्वादों में पैडिंग के रूप में अंत में = एक शामिल हो सकता है। इसके अतिरिक्त, कुछ बेस 64 वेरिएंट + और / अलावा अन्य वर्णों का उपयोग कर सकते हैं एक सिंहावलोकन के लिए विकिपीडिया पर वेरिएंट सारांश तालिका देखें।

संक्षिप्त जवाब

आपको base64.b64encode() विधि में एक bytes-like ऑब्जेक्ट ( bytes , base64.b64encode() , इत्यादि) base64.b64encode() देना 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 में बेस -64 एन्कोडिंग

base64 एन्कोडिंग 6-बिट बाइनरी खंडों को लेती है और एज़, एज़, 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 ZXN 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 GV zd A 

इसलिए, 'B0ZXN0' हमारे बाइनरी का आधार -64 संस्करण है, गणितीय रूप से बोल रहा है। हालांकि, base64 एन्कोडिंग को विपरीत दिशा में एन्कोडिंग करना पड़ता है (इसलिए कच्चे डेटा को 'डीजीवीजाडीए' में परिवर्तित किया जाता है) और अन्य एप्लिकेशन को बताने का नियम भी होता है कि अंत में कितना स्थान छोड़ा जाता है यह '=' प्रतीकों के साथ अंत में पैडिंग द्वारा किया जाता है इसलिए, इस डेटा के आधार base64 एन्कोडिंग 'डीजीवीज़डीए ==' है, दो 'बिट' के बिट्स को इंगित करने के लिए दो '=' प्रतीकों को अंत से निकालने की आवश्यकता होगी, जब यह डेटा मूल डेटा से मेल खाएगा।

आइए देखें कि मैं बेईमान हूं या नहीं:

 >>> encoded = base64.b64encode(data) >>> print(encoded) b'dGVzdA==' 

अब आपके प्रश्न की जड़ के लिए: पायथन 3 में, str ऑब्जेक्ट सी-स्टाइल कैरेक्टर एरेज़ नहीं हैं (इसलिए वे बाइट एरेज़ नहीं हैं), बल्कि डेटा स्ट्रक्चर्स जिनमें कोई अंतर्निहित या एन्कोडिंग नहीं है। आप विभिन्न तरीकों से उस स्ट्रिंग को सांकेतिक शब्दों में बदल सकते हैं (या इसका व्याख्या कर सकते हैं) सबसे आम (और पायथन 3 में डिफ़ॉल्ट) यूटीएफ -8 है, खासकर क्योंकि यह एएससीआईआई के साथ पीछे की तरफ संगत है (हालांकि, जैसा कि सबसे व्यापक रूप से इस्तेमाल किया गया एनकोडिंग है)। जब आप string लेते हैं और उस पर .encode() विधि को कॉल करते हैं तो ये हो रहा है: पायथन यूटीएफ -8 (डिफ़ॉल्ट एन्कोडिंग) में स्ट्रिंग को व्याख्या कर रहा है।

base64 एन्कोडिंग का उपयोग क्यों करें?

मान लें कि मुझे कुछ डेटा ईमेल के माध्यम से भेजना होगा, इस डेटा की तरह:

 >>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20' >>> print(data.decode()) >>> print(data) b'\x04msg\x08\x08\x08 ' >>> 

दो समस्याएं हैं जिन्हें मैंने लगाया है:

  1. अगर मैंने उस ईमेल को यूनिक्स में भेजने की कोशिश की तो ई-मेल के रूप में जल्द ही \x04 वर्ण पढ़ा जायेगा, क्योंकि यह END-OF-TRANSMISSION (Ctrl-D) के लिए एएससीआईआई है, इसलिए शेष डेटा को छोड़ दिया जाएगा संचरण।
  2. इसके अलावा, जब पायथन बहुत चालाक है, जब मैं सीधे डेटा मुद्रित करता हूं, जब यह स्ट्रिंग एएससीआईआई के रूप में डीकोड हो जाती है, तब आप मेरे सभी बुराई नियंत्रण पात्रों से बच सकते हैं, आप देख सकते हैं कि 'msg' वहां नहीं है। इसका कारण यह है कि मैंने 'संदेश' को मिटाने के लिए तीन BACKSPACE वर्ण और तीन SPACE वर्णों का उपयोग किया। इस प्रकार, यहां तक ​​कि अगर मेरे पास EOF चरित्र नहीं था, तो अंतिम उपयोगकर्ता स्क्रीन पर टेक्स्ट से असली, कच्चे डेटा में अनुवाद करने में सक्षम नहीं होगा।

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

यदि एन्कोडेड किए गए डेटा में "विदेशी" वर्ण शामिल हैं, तो मुझे लगता है कि आपको "UTF-8" में एन्कोड करना होगा

 encoded = base64.b64encode (bytes('data to be encoded', "utf-8")) 

आप सभी की जरूरत है:

 expected bytes, not str 

प्रमुख b आपकी स्ट्रिंग बाइनरी बनाता है

क्या आप Python का उपयोग करते हैं? 2.x या 3.x?

संपादित करें: पायथन में स्ट्रिंग्स के धूर्त विवरण के लिए देखें http://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit 3.x

यदि स्ट्रिंग यूनिकोड सबसे आसान तरीका है:

 import base64 a = base64.b64encode(bytes(u'complex string: ñáéíóúÑ', "utf-8")) b = base64.b64decode(a).decode("utf-8", "ignore") print(b)