क्या Base64 डेटा को मान्य या शुद्ध करने के लिए RegEx का उपयोग करना संभव है? यह आसान सवाल है, लेकिन इस सवाल को चलाने वाले कारक हैं जो इसे मुश्किल बनाते हैं।
मेरे पास एक बेस 64 डिकोडर है जो आरएफसी चश्मा का पालन करने के लिए इनपुट डेटा पर पूरी तरह से भरोसा नहीं कर सकता है। इसलिए, मैं जिन मुद्दों का सामना कर रहा हूं, वे शायद आधार 64 डेटा जैसे मुद्दे हैं जो 78 में टूट नहीं सकते हैं (मुझे लगता है कि यह 78 है, मुझे आरएफसी की दोहरी जांच करनी होगी, इसलिए सटीक संख्या गलत होने पर मुझे डिंग न करें) चरित्र लाइनें, या कि लाइनें CRLF में समाप्त नहीं हो सकती हैं; इसमें केवल एक सीआर, या एलएफ, या शायद नहीं हो सकता है।
तो, मैं एक समय के आधार के रूप में इस तरह से स्वरूपित Base64 डेटा पार्स करने का एक नरक था। इसके कारण, निम्नलिखित जैसे उदाहरण मज़बूती से समझाना असंभव हो जाते हैं। मैं केवल संक्षिप्त MIME हेडर्स को संक्षिप्तता के लिए प्रदर्शित करूंगा।
Content-Transfer-Encoding: base64
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu
ठीक है, इसलिए कोई समस्या नहीं है, और वास्तव में हम उम्मीद करेंगे परिणाम है। और 99% मामलों में, किसी भी कोड का उपयोग करके कम से कम यह सत्यापित करें कि बफर में प्रत्येक चार एक वैध बेस 64 चार्ट है, पूरी तरह से काम करता है। लेकिन, अगले उदाहरण मिश्रण में एक रिंच फेंकता है।
Content-Transfer-Encoding: base64
http://www.stackoverflow.com
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu
Base64 एन्कोडिंग का यह संस्करण जो मैंने कुछ वायरस और अन्य चीजों में देखा है जो कुछ मेल पाठकों को हर कीमत पर माइम को पार्स करने की इच्छा का लाभ उठाने का प्रयास करते हैं, बनाम जो पुस्तक द्वारा सख्ती से चलते हैं, या आरएफसी; अगर तुम।
मेरा बेस 64 डिकोडर निम्नलिखित डेटा स्ट्रीम का दूसरा उदाहरण बताता है। और यहाँ ध्यान रखें, मूल धारा सभी ASCII डेटा है!
[0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D
2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8
किसी के पास एक ही समय में दोनों समस्याओं को हल करने का एक अच्छा तरीका है? मुझे यकीन नहीं है कि यह संभव भी नहीं है, डेटा के दो अलग-अलग नियमों को लागू करने और परिणामों की तुलना करने पर। हालाँकि अगर आपने वह तरीका अपना लिया, तो आपको किस आउटपुट पर भरोसा है? ऐसा लगता है कि ASCII हेयुरेटिक्स सबसे अच्छे समाधान के बारे में है , लेकिन कितना अधिक कोड, निष्पादन समय, और जटिलता है कि वायरस स्कैनर के रूप में जटिल में कुछ जोड़ देगा, जो इस कोड वास्तव में शामिल है? आप यह जानने के लिए कि आधारभूत स्वीकार्य6464 क्या है, और क्या नहीं है, यह जानने के लिए आप ह्यूरिस्टिक्स इंजन को कैसे प्रशिक्षित करेंगे?
अपडेट करें:
इस प्रश्न को देखने के लिए संख्या को जारी रखें, मैंने सरल RegEx को पोस्ट करने का फैसला किया है जिसका उपयोग मैं 3 साल से C # एप्लिकेशन में कर रहा हूं, जिसमें सैकड़ों हजारों लेनदेन हैं। ईमानदारी से, मुझे गंबू द्वारा दिया गया उत्तर सबसे अच्छा लगता है, यही वजह है कि मैंने इसे चयनित उत्तर के रूप में चुना। लेकिन C # का उपयोग करने वाले किसी भी व्यक्ति के लिए, और कम से कम यह पता लगाने के लिए कि क्या एक स्ट्रिंग, या बाइट [] में वैध बेस 64 डेटा शामिल हैं या नहीं, बहुत जल्दी रास्ता खोज रहा है, मैंने पाया है कि मेरे लिए बहुत अच्छी तरह से काम करना है।
[^-A-Za-z0-9+/=]|=[^=]|={3,}$
और हां, यह बस बेस 64 डेटा के एक STRING के लिए है , RFC1341 संदेश को ठीक से फॉर्मेट नहीं किया गया है । इसलिए, यदि आप इस प्रकार के डेटा के साथ काम कर रहे हैं, तो कृपया उपरोक्त RegEx का उपयोग करने का प्रयास करने से पहले इसे ध्यान में रखें। यदि आप अन्य उद्देश्यों (URL, फ़ाइल नाम, XML एन्कोडिंग, आदि) के लिए Base16, Base32, Radix या यहां तक कि Base64 के साथ काम कर रहे हैं, तो यह अत्यधिक अनुशंसा की जाती है कि आप RFC4648 पढ़ें जिसे गम्बो ने अपने उत्तर में उल्लिखित किया है, जो अच्छी तरह से होना चाहिए। इस प्रश्न / उत्तर सेट में सुझावों का उपयोग करने से पहले कार्यान्वयन द्वारा उपयोग किए जाने वाले चारसेट और टर्मिनेटरों के बारे में पता है।