Base64: अंतरिक्ष उपयोग में सबसे खराब संभावित वृद्धि क्या है?


168

यदि किसी सर्वर को एक बेस 64 स्ट्रिंग प्राप्त हुई है और वह कनवर्ट करने से पहले इसकी लंबाई की जांच करना चाहता है, तो कहें कि यह हमेशा अंतिम बाइट सरणी को 16KB करने की अनुमति देना चाहता था। बेस 64 स्ट्रिंग (एक बाइट प्रति वर्ण मानकर) में परिवर्तित होने पर संभवतः 16KB बाइट सरणी कितना बड़ा हो सकता है?

जवाबों:


245

Base64 तीन बाइट्स के प्रत्येक सेट को चार बाइट्स में एन्कोड करता है। इसके अलावा आउटपुट हमेशा चार में से एक होने के लिए गद्देदार होता है।

इसका मतलब यह है कि आकार के एक स्ट्रिंग के बेस -64 प्रतिनिधित्व का आकार n है:

ceil(n / 3) * 4

तो, एक 16kB सरणी के लिए, बेस -64 प्रतिनिधित्व छत (16 * 1024/3) * 4 = 21848 बाइट्स लंबे ~ = 21.8kB होगा।

एक मोटा अनुमान यह होगा कि डेटा का आकार मूल के 4/3 तक बढ़ जाता है।


क्या हमें लंबाई में 2 जोड़ने की आवश्यकता है या नहीं?
vIceBerg

@vIceBerg, यह इस बात पर निर्भर करता है कि आप संख्याओं के ceilसाथ उपयोग कर रहे हैं float, या केवल intसंख्याओं के साथ। (और नहीं ceil)
ब्रायन फील्ड

7
मुझे लगता है कि इसे लगाने का सरल तरीका यह है कि आप मूल आकार का 1/3 जोड़ते हैं।
mvmn

1
आपके द्वारा प्रस्तावित उदाहरण में, माप के समान क्रम में परिणाम दिखाने से उत्तर की गुणवत्ता थोड़ी बढ़ जाएगी (21848 बाइट्स के बजाय 21,3 KB)।
इवान डी पाज़ सेंटेनो

36

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

ध्यान दें कि n बाइट्स का एक इनपुट दिया गया है, आउटपुट (n + 2 - ((n + 2)% 3)) / 3 * 4 बाइट्स लंबा होगा, ताकि प्रति इनपुट बाइट की आउटपुट बाइट्स की संख्या 4/3 हो जाए या बड़े एन के लिए 1.33333।

तो 16kb * 4/3 21.3 'kb, या 21848 बाइट्स पर बहुत कम देता है, सटीक होने के लिए।

उम्मीद है की यह मदद करेगा


11

16kb 131,072 बिट्स है। बेस 6, 24-बिट बफ़र्स को चार 6-बिट वर्ण एप्स में पैक करता है, इसलिए आपके पास 5,462 * 4 = 21,848 बाइट्स होंगे।


5

चूंकि प्रश्न सबसे खराब संभावित वृद्धि के बारे में था, इसलिए मुझे जोड़ना होगा कि आमतौर पर प्रत्येक 80 वर्णों पर लाइन ब्रेक होते हैं। इसका मतलब है कि अगर आप विंडोज पर टेक्स्ट फाइल में बेस 64 एनकोडेड डेटा सेव कर रहे हैं तो यह प्रत्येक लाइन पर लिनक्स 1 बाइट पर 2 बाइट्स जोड़ देगा।

वास्तविक एन्कोडिंग से वृद्धि ऊपर वर्णित की गई है।


3
क्या चरम मामला नहीं है कि 1 स्रोत बाइट 4 बेस 64 बाइट्स बन जाता है, इसलिए 4 गुना वृद्धि? किसी भी लंबे समय तक स्रोत सामग्री को एक बेहतर अनुपात मिलता है, जब तक कि अन्य लोगों ने कहा, यह asymptotically 1.333 तक पहुंचता है ...
ओली

1

यह अपने लिए भविष्य का संदर्भ है। चूंकि सवाल सबसे खराब स्थिति पर है, हमें लाइन ब्रेक को ध्यान में रखना चाहिए। जबकि RFC 1421 अधिकतम लाइन लंबाई 64 char को परिभाषित करता है, RFC 2045 (MIME) में कहा गया है कि अधिकतम एक पंक्ति में 76 char होंगे।

उत्तरार्द्ध वह है जो C # लाइब्रेरी ने लागू किया है। इसलिए विंडोज वातावरण में जहां एक लाइन ब्रेक 2 वर्ण (\ r \ n) है, हमें यह मिलता है:Length = Floor(Ceiling(N/3) * 4 * 78 / 76)

नोट: फ़्लोरिंग इसलिए है क्योंकि C # के साथ मेरे परीक्षण के दौरान, यदि अंतिम पंक्ति बिल्कुल 76 वर्णों पर समाप्त होती है, तो कोई भी लाइन-ब्रेक अनुसरण नहीं करता है।

मैं निम्नलिखित कोड चलाकर इसे साबित कर सकता हूं:

byte[] bytes = new byte[16 * 1024];
Console.WriteLine(Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks).Length);

16 kBytes का जवाब 7664-लाइनों के साथ base64 में एन्कोड किया गया: 22422 चार्ट

लिनक्स में मान लें, Length = Floor(Ceiling(N/3) * 4 * 77 / 76)लेकिन मैं इसे अभी तक अपने .NET कोर पर परीक्षण करने के लिए नहीं मिला।

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