2010-07-06 10 views
41

क्या एक XML दस्तावेजBase64 हेक्स बनाम

मैं Base64 और हेक्स के बारे में पता है, क्या वास्तविक अंतर है अंदर सिस्टम के बीच द्विआधारी सामग्री भेजने का सबसे अच्छा तरीका है। मैं वर्तमान में बेस 64 का उपयोग कर रहा हूं लेकिन इसके लिए बाहरी कॉमन्स लाइब्रेरी को शामिल करने की आवश्यकता है, जहां हेक्स के साथ मुझे लगता है कि मैं सिर्फ एक फ़ंक्शन बना सकता हूं।

+0

तो आप जो कह रहे हैं वह यह है कि यदि आपके पास यह बाइनरी नंबर 1110 हेक्स प्रत्येक बाइट के लिए दो अक्षर लेगा तो तकनीकी रूप से आप एएबीबीसीसीडीडी कहेंगे जो तब हेक्स वैल्यू होगा, लेकिन बेस 64 में यह तीन अक्षर एएएबीबीबीसीसीसीडीडी लेता है। क्या यह देखने का तकनीकी तरीका होगा। मुझे यकीन है कि एएबीबीसीसीडीडी संख्या के लिए हेक्स में सही मूल्य नहीं है। कुछ हैशिंग फ़ंक्शन कुछ अलग-अलग लंबाई में मान वापस क्यों भेजते हैं। उदाहरण के लिए मेरे पास आज सुबह एक एमडी 5 उदाहरण था कि मैंने ए के बाद परीक्षण किया और फिर सी और बी हैश वैल्यू दूसरे दो की तुलना में एक चरित्र कम था। डौग –

उत्तर

85

आप बेस 64 के लिए भी अपनी खुद की विधि लिख सकते हैं ... लेकिन मैं आम तौर पर दोनों के लिए बाहरी, अच्छी तरह से परीक्षण पुस्तकालयों का उपयोग करने की सलाह देता हूं। (ऐसा नहीं है कि उनमें कोई कमी है।)

बेस 64 और हेक्स के बीच का अंतर वास्तव में बाइट्स का प्रतिनिधित्व कैसे किया जाता है। हेक्स "बेस 16" कहने का एक और तरीका है। हेक्स प्रत्येक बाइट के लिए दो अक्षर लेगा - बेस 64 प्रत्येक 3 बाइट्स के लिए 4 अक्षर लेता है, इसलिए यह हेक्स से अधिक कुशल है। मान लें कि आप XML दस्तावेज़ को एन्कोड करने के लिए यूटीएफ -8 का उपयोग कर रहे हैं, एक 100K फ़ाइल हेक्स में एन्कोड करने के लिए 200K या बेस 64 में 133K ले जाएगी। बेशक यह अच्छी तरह से हो सकता है कि आपको अंतरिक्ष दक्षता की परवाह नहीं है - कई मामलों में इससे कोई फर्क नहीं पड़ता। यदि यह मामला है, तो स्पष्ट रूप से उस मोर्चे पर बेस 64 बेहतर है। (ऐसे विकल्प हैं जो अधिक कुशल हैं, लेकिन वे समान नहीं हैं।)

+0

खैर, यह एक मोबाइल फोन के लिए है, इसलिए आम कोडेक एक overkill का एक छोटा सा की तरह प्रतीत होता है सहित, मैं सिर्फ हेक्स मार्ग के रूप में मैं एन्कोडिंग डिकोडिंग इतना वैसे भी नहीं होगा/हो सकता है। – jax

+7

@jax: मैं कहेंगे कि एक मोबाइल पर किया जा रहा है यह बहुत * अधिक * बेस 64 उपयोग करने के लिए महत्वपूर्ण है, जब डिवाइस (भंडारण और स्मृति) पर अंतरिक्ष विवश है, और इसलिए नेटवर्क बैंडविड्थ है होगा। जब तक आप केवल * बहुत छोटी * फ़ाइलों को संग्रहित नहीं कर रहे हैं (और उनमें से कई नहीं) आप बेस 64 लाइब्रेरी समेत बहुत बेहतर होने की संभावना रखते हैं। जब इनकोडिंग डेटा बिट के लिहाज से तुलना की जाती है –

+2

मैं तथ्य यह है कि एक हेक्स इनकोडिंग मूल्य अपनी सॉर्ट क्रम को बनाए रखता है उल्लेख होता है, जबकि - (वहाँ की * सिर्फ * बेस 64 रूपांतरण के आसपास स्रोत फ़ाइलें हैं यह होने के लिए नहीं है कॉमन्स कोडेक।) बेस 64 नहीं है। यह कुछ परिस्थितियों में विशेष रूप से महत्वपूर्ण है, उदाहरण के लिए जब कुछ डेटा संरचनाओं को लागू करने के लिए उपयोग किया जाता है। – Mario

4

बेस 64 में कम ओवरहेड है (बेस 64 मूल डेटा के प्रत्येक 3 बाइट्स के लिए 4 वर्ण उत्पन्न करता है जबकि हेक्स मूल डेटा के प्रत्येक बाइट के लिए 2 वर्ण उत्पन्न करता है)। हेक्स अधिक पठनीय है - आप केवल दो अक्षरों को देखते हैं और तत्काल जानते हैं कि बाइट पीछे क्या है, लेकिन बेस 64 के साथ आपको 4-वर्ण समूह को डीकोड करने के प्रयास की आवश्यकता है, इसलिए हेक्स के साथ डीबगिंग आसान हो जाएगी।

19

इनमें केवल दो 'असली मतभेद':

  1. मूलांक। बेस 64 बेस -64 है, आश्चर्य है, और हेक्स आधार -16 है।

  2. एन्कोडिंग: बेस -64 एन्कोड 3 स्रोत बाइट्स 4 बेस -64 अक्षरों में (http://en.wikipedia.org/wiki/Base64#Examples); हेक्स 1 हेक्टेयर 2 हेक्टेयर अक्षरों में एन्कोड करता है।

तो बेस 64 हेक्स से अधिक कॉम्पैक्ट है।

+0

के आधार पर जवाब में कोई त्रुटि है। मैंने एक संपादन सबमिट किया है, लेकिन यह अभी भी लंबित है। प्वाइंट # 2 होना चाहिए: "2. एन्कोडिंग: आधार -64 encodes 3 स्रोत 4 आधार -64 अक्षरों में बाइट्स (http://en.wikipedia.org/wiki/Base64#Examples); हेक्स 2 हेक्स में 1 बाइट encodes वर्ण।" – Roberto

+0

@ रॉबर्टो हाँ, धन्यवाद। – EJP

10

अन्य उत्तरों ने बेस 16 और बेस 64 के बीच दक्षता अंतर को स्पष्ट किया।

दक्षता की तुलना में आधार चयन के लिए और भी कुछ है।

बेस 64 केवल अक्षरों और संख्याओं से अधिक उपयोग करता है। Different implementations पैडिंग को इंगित करने और 64 के सेट के अंतिम दो वर्ण बनाने के लिए अलग विराम चिह्नों का उपयोग करें। इसमें प्लस "+" और बराबर "=" शामिल हो सकता है। HTTP क्वेरी स्ट्रिंग में दोनों समस्याग्रस्त।

तो बेस 64 पर बेस 16 का पक्ष लेने का एक कारण यह है कि आधार 16 मानों को अतिरिक्त एन्कोडिंग की आवश्यकता के बिना HTTP क्वेरी स्ट्रिंग में सीधे बनाया जा सकता है। क्या यह आपके लिए महत्वपूर्ण है?

ध्यान दें कि यह दक्षता के ऊपर और ऊपर एक अतिरिक्त चिंता है। न तो आधार स्वाभाविक रूप से बेहतर या बदतर है; वे एक पैमाने पर केवल दो अलग-अलग बिंदु हैं, जिन पर आपको विभिन्न गुण मिलेंगे जो विभिन्न परिस्थितियों में कम या ज्यादा आकर्षक होंगे।

उदाहरण के लिए, base32 पर विचार करें। यह बेस 64 की तुलना में 20% कम कुशल है, लेकिन अभी भी HTTP क्वेरी स्ट्रिंग में उपयोग के लिए उपयुक्त है। इसकी अधिकांश अक्षमता मनुष्यों द्वारा प्रजनन में गलतियों के लिए केस-असंवेदनशील और शून्य "0" और एक "1" से परहेज करने से होती है।

तो base32 एक नई चिंता का विषय से परिचित करवाता है मनुष्यों के लिए प्रजनन में आसानी। क्या यह आपके लिए चिंता का विषय है? यदि ऐसा नहीं है, तो आप base62, जो अभी भी HTTP क्वेरी स्ट्रिंग में सुविधाजनक है की तरह कुछ के लिए जा सकते हैं, लेकिन केस संवेदी है और शामिल हैं शून्य "0" और "1"।

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

विकिपीडिया में numeral systems की मजेदार सूची है।

+0

केस संवेदनशीलता क्या मुझे या तो base32 या बेस 64 से अधिक हेक्स चयन करने के लिए नेतृत्व किया है। पारितोषिक के लिए धन्यवाद! – hourback

2

आकार आप के लिए महत्वपूर्ण है?

बेस 64 अधिक स्थान कुशल है। 3 बाइट्स का प्रतिनिधित्व करने के लिए 4 अक्षरों का उपयोग करना जहां हेक्स प्रत्येक बाइट के लिए 2 वर्णों का उपयोग करता है। दूसरे शब्दों में: हेक्स स्ट्रिंग के आकार को 100% के साथ बढ़ाता है। यूआरएल अनुरोधों में पैराम के रूप में फिट होने वाले छोटे तारों के लिए मुझे अतिरिक्त लागत/आकार पर कोई ध्यान नहीं दिखेगा।

क्या आपके लिए उपयोग की आसानी आसान है?

हेक्स (यह +, = और / हो सकती है) जब यूआरएल अनुरोधों में प्राप्त पैरामीटर के रूप में स्ट्रिंग का उपयोग Base64 से उपयोग करने के लिए है क्योंकि आप से बचने के लिए की जरूरत नहीं है आसान है।

क्या आपके लिए व्यापक उपयोग महत्वपूर्ण है?

मेरे पास संख्याएं नहीं हैं, लेकिन कई कारकों के आधार पर बेस 64 सामान्य डेवलपर को हेक्स की तुलना में अधिक ज्ञात हो सकता है। मैं हेक्स (बेस 16) से पहले बेस 64 के बारे में जानता था।

2

मैं उत्सुक था कि ईरथ बेस 64 पर 3 इनपुट बाइट्स को केवल 33% स्पेस ग्रोथ के लिए 4 आउटपुट बाइट्स में परिवर्तित कर सकते हैं (जबकि हेक्स 100 इनपुट स्पेस ग्रोथ के लिए 1 इनपुट बाइट में 2 इनपुट बाइट परिवर्तित करता है)। विशेष रूप से 3 इनपुट बाइट क्यों?

जवाब है:

3 बाइट्स = 3 x 8 बिट = 24 बिट।

क्यों कि जादू "24 बिट" नंबर? खैर, आधार 64 संख्या 0 से 63 का प्रतिनिधित्व करता है। बाइनरी में उनका प्रतिनिधित्व कैसे किया जाता है? 000000 (0) से 111111 (63) के साथ।

बिंगो! प्रत्येक बेस 64 चरित्र (जैसे "Z", आदि के रूप में एक चरित्र) इनपुट डेटा के 6 बिट एक भी उत्पादन बाइट का उपयोग कर का प्रतिनिधित्व करता है।

तो 24 बिट्स (इनपुट के 3 पूर्ण बाइट)/6 बिट्स (बेस 64 वर्णमाला) = बेस 64 के 4 बाइट्स। बस!

आप सोच सकते हैं कि "बेस 128 (आउटपुट के 7 बिट्स इनपुट = 8 बिट्स आउटपुट) क्यों नहीं, एन्कोडिंग के दौरान केवल 14% आकार की वृद्धि पर?"। इसका उत्तर यह है कि बेस 64 सबसे अच्छा है जिसे हम पा सकते हैं, क्योंकि निम्न 128 ASCII वर्ण सभी प्रिंट करने योग्य नहीं हैं। कई नियंत्रण अक्षर जैसे कि न्यूल इत्यादि हैं

शायद "बेस 81" जैसे अन्य सिस्टम बनाने के तरीके स्पष्ट रूप से हैं, क्योंकि आप कस्टम एन्कोडिंग एल्गोरिदम बनाते समय कुछ भी कर सकते हैं। लेकिन बेस 64 की सुंदरता यह है कि यह 6 बिट्स के हिस्सों में डेटा को इतनी साफ तरीके से कैसे एन्कोड करता है। तो एन्कोडिंग योजना लोकप्रिय हो गई।

अब आप इसे पढ़ने के बाद उम्मीदवार समझदार हैं।

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