বেস 64: স্থান ব্যবহারের সবচেয়ে খারাপ সম্ভাব্য বৃদ্ধি কী?


166

যদি কোনও সার্ভার একটি বেস 64 স্ট্রিং পেয়ে থাকে এবং রূপান্তর করার আগে এর দৈর্ঘ্যটি পরীক্ষা করতে চায়, বলে যে এটি সর্বদা চূড়ান্ত বাইট অ্যারে 16 কেবি হওয়ার অনুমতি দিতে চেয়েছিল। একটি বেস 64 স্ট্রিংয়ে রূপান্তরিত হলে (চরিত্র অনুসারে একটি বাইট অনুমান করে) 16KB বাইট অ্যারে সম্ভবত কত বড় হতে পারে?

উত্তর:


242

বেস 64 তিনটি বাইটের প্রতিটি সেটকে চার বাইটে এনকোড করে। এছাড়াও আউটপুট সর্বদা চারটির একাধিক হতে প্যাড করা হয়।

এর অর্থ হ'ল এন-স্ট্রিংয়ের বেস-64৪ উপস্থাপনের আকারটি হ'ল:

ceil(n / 3) * 4

সুতরাং, একটি 16 কেবি অ্যারের জন্য, বেস-64৪ উপস্থাপনাটি সিল (16 * 1024/3) * 4 = 21848 বাইট দীর্ঘ ~ = 21.8 কেবি হবে।

একটি রুক্ষ পড়তা হবে যে ডেটা আকার মূল 4/3 বৃদ্ধি করা হয়।


আমাদের দৈর্ঘ্যে 2 যোগ করার দরকার আছে কি না?
ভাইসবার্গ

@vIceBerg, আপনি সংখ্যার ceilসাথে ব্যবহার করছেন কিনা তা নির্ভর করে float, বা কেবল intসংখ্যাগুলি। (এবং না ceil)
ব্রায়ান ফিল্ড

7
আমি মনে করি এটির সহজ উপায়টি আপনি আসল আকারের 1/3 যোগ করেন।
এমভিএমএন

1
উদাহরণ হিসাবে আপনি প্রস্তাব করেছেন, একই ক্রম হিসাবে পরিমাপের ফলাফলটি দেখানো উত্তরের গুণমানকে কিছুটা বাড়িয়ে তুলবে (21848 বাইটের পরিবর্তে 21,3 কেবি)।
ইভান দে পাজ সেন্তেনো

36

উইকিপিডিয়া থেকে

নোট করুন যে এন বাইটগুলির একটি ইনপুট দেওয়া হয়েছে, আউটপুট হবে (n + 2 - ((n + 2)% 3)) / 3 * 4 বাইট দীর্ঘ, যাতে প্রতি ইনপুট বাইটের আউটপুট বাইটগুলি 4/3 তে রূপান্তরিত হয় বা বড় এন এর জন্য 1.33333।

সুতরাং 16 কেবি * 4/3 সঠিক হতে 21.3 'কেবি বা 21848 বাইটের চেয়ে কম দেয়।

আশাকরি এটা সাহায্য করবে


11

16 কেবি 131,072 বিট। বেস64 24-বিট বাফারগুলিকে চারটি 6-বিট অক্ষরের পরিমাণে প্যাক করে, যাতে আপনার 5,462 * 4 = 21,848 বাইট থাকে।


5

যেহেতু প্রশ্নটি সবচেয়ে খারাপ সম্ভাব্য বৃদ্ধি সম্পর্কে ছিল, তাই আমি অবশ্যই যুক্ত করব যে প্রায় প্রতিটি ৮০ টি চরিত্রের প্রায়শই লাইন ব্রেক হয়। এর অর্থ হ'ল যদি আপনি উইন্ডোজের কোনও পাঠ্য ফাইলে বেস 64 এনকোডড ডেটা সংরক্ষণ করেন তবে এটি প্রতিটি লাইনের জন্য লিনাক্স 1 বাইটে 2 বাইট যুক্ত করবে।

প্রকৃত এনকোডিং থেকে বৃদ্ধি উপরে বর্ণিত হয়েছে।


3
1 সোর্স বাইট 4 বেস 64 বাইট হয়ে যায় তাই কি চরম ক্ষেত্রে হয় না, তাই 4x বৃদ্ধি? অন্য যেহেতু উত্স উপাদানগুলি আরও ভাল অনুপাত পায় যতক্ষণ না অন্যেরা বলেছে, এটি asympototically 1.333 এ পৌঁছেছে ...
অলি

1

এটি আমার জন্য ভবিষ্যতের রেফারেন্স। যেহেতু প্রশ্নটি সবচেয়ে খারাপ ক্ষেত্রে, তাই আমাদের উচিত লাইন ব্রেকগুলি অ্যাকাউন্টে নেওয়া। আরএফসি 1421 সর্বোচ্চ রেখার দৈর্ঘ্য char৪ চর হিসাবে নির্ধারণ করেছে, আরএফসি 2045 (এমআইএমআই) জানিয়েছে যে সেখানে এক লাইনে সর্বাধিক 76 76 চর থাকবে।

পরেরটি সি # লাইব্রেরি প্রয়োগ করেছে। সুতরাং উইন্ডোজ পরিবেশে যেখানে একটি লাইন বিরতি 2 অক্ষর (\ r \ n) হয়, আমরা এটি পাই:Length = Floor(Ceiling(N/3) * 4 * 78 / 76)

দ্রষ্টব্য: মেঝেটি সি # এর সাথে আমার পরীক্ষার সময় যদি শেষ লাইনটি ঠিক 76 টি অক্ষরে শেষ হয় তবে কোনও লাইন ব্রেক বিরত হয় না।

আমি নিম্নলিখিত কোডটি চালিয়ে প্রমাণ করতে পারি:

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

16 কেবাইটের উত্তর 76-চর লাইনের সাথে বেস 64 এ এনকোড করেছে: 22422 অক্ষর

লিনাক্সে ধরে Length = Floor(Ceiling(N/3) * 4 * 77 / 76)নিই এটি হ'ল তবে এটি এখনও আমার .NET কোর এ পরীক্ষার জন্য পাই নি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.