ইনপুট দৈর্ঘ্য 3 দ্বারা বিভাজ্য না হলে কেন বেস 64 এনকোডিংয়ের জন্য প্যাডিং দরকার?


103

বেস 64 এনকোডিংয়ে প্যাডিংয়ের উদ্দেশ্য কী। নিম্নলিখিত উইকিপিডিয়া থেকে নিষ্কাশন:

"একটি অতিরিক্ত প্যাড অক্ষর বরাদ্দ করা হয়েছে যা এনকোডড আউটপুটটিকে 4 টি অক্ষরের পূর্ণসংখ্যাকারে জোর করতে ব্যবহৃত হতে পারে (বা সমানভাবে যখন বিন্যাসবিহীন বাইনারি পাঠ্য 3 বাইটের একাধিক নয়); এই প্যাডিং অক্ষরগুলি তখন ডিকোডিংয়ের সময় বাতিল করতে হবে তবে তারপরে বিন্যাসবিহীন পাঠ্যের কার্যকর দৈর্ঘ্যের গণনার অনুমতি দিন, যখন এর ইনপুট বাইনারি দৈর্ঘ্যটি 3 বাইটের একাধিক না হয় (সর্বশেষ নন-প্যাড অক্ষরটি সাধারণত এনকোড থাকে যাতে এটি প্রদর্শিত সর্বশেষ 6-বিট ব্লকটি শূন্য হয় এটির সর্বনিম্ন তাৎপর্যপূর্ণ বিটগুলিতে প্যাড করা, সর্বাধিক দুটি প্যাড অক্ষর এনকোডড স্ট্রিমের শেষে ঘটতে পারে)।

আমি এমন একটি প্রোগ্রাম লিখেছিলাম যা কোনও স্ট্রিংকে বেসড করতে পারে এবং কোনও বেস 64 এনকোডেড স্ট্রিং ডিকোড করতে পারে। প্যাডিং কোন সমস্যা সমাধান করে?

উত্তর:


215

আপনার উপসংহার যে প্যাডিং অপ্রয়োজনীয় ঠিক আছে। এনকোড সিকোয়েন্সের দৈর্ঘ্য থেকে নির্বিঘ্নে ইনপুটটির দৈর্ঘ্য নির্ধারণ করা সর্বদা সম্ভব।

তবে, প্যাডিং এমন পরিস্থিতিতে কার্যকর যেখানে বেস 64৪ এনকোডযুক্ত স্ট্রিংগুলি এমনভাবে সংহত করা হয় যাতে পৃথক ক্রমগুলির দৈর্ঘ্য নষ্ট হয়ে যায়, যেমন ঘটতে পারে, উদাহরণস্বরূপ, খুব সাধারণ নেটওয়ার্ক প্রোটোকলে।

যদি আনপ্যাডযুক্ত স্ট্রিংগুলি সংক্ষিপ্ত করা হয় তবে মূল ডেটাটি পুনরুদ্ধার করা অসম্ভব কারণ প্রতিটি পৃথক ক্রমের শেষে বিজোড় বাইটগুলির সংখ্যা হারিয়ে যায়। তবে, যদি প্যাডেড সিকোয়েন্সগুলি ব্যবহার করা হয়, তবে কোনও অস্পষ্টতা নেই এবং পুরো ক্রমটি সঠিকভাবে ডিকোড করা যায়।

সম্পাদনা: একটি চিত্র

মনে করুন আমাদের কাছে এমন একটি প্রোগ্রাম রয়েছে যা শব্দগুলিকে বেসড করে words এটি "আমি", "এএম" এবং "টিজেএম" এনকোড করে, প্যাডিং ছাড়াই ফলাফলগুলি এক সাথে স্যান্ডউইচ করে এবং সেগুলি প্রেরণ করে।

  • ISQ( SQ==প্যাডিং সহ) এ এনকোড
  • AMQU0( QU0=প্যাডিং সহ) এ এনকোড
  • TJMVEpN( VEpNপ্যাডিং সহ) এ এনকোড

সুতরাং প্রেরিত তথ্য হয় SQQU0VEpN। রিসিভারটি বেস 64 এর I\x04\x14\xd1Q)পরিবর্তে এটিটিকে ডিকোড করে IAMTJM। ফলাফলটি আজেবাজে কারণ প্রেরক প্রতিটি শব্দ এনকোডযুক্ত ক্রমিকায় কোথায় শেষ হয় সে সম্পর্কে তথ্য নষ্ট করে দিয়েছে । প্রেরক যদি এর SQ==QU0=VEpNপরিবর্তে প্রেরণ করে থাকেন তবে গ্রাহক এটিকে তিনটি পৃথক বেস 64 সিকোয়েন্স হিসাবে ডিকোড করতে পারতেন যা দিতে সম্মত হবে IAMTJM

প্যাডিং দিয়ে বিরক্ত কেন?

কেন প্রতিটি সংখ্যার দৈর্ঘ্য সহ প্রতিটি শব্দকে উপসর্গের জন্য প্রোটোকলটি ডিজাইন করবেন না? তারপরে রিসিভার স্ট্রিমটি সঠিকভাবে ডিকোড করতে পারে এবং প্যাডিংয়ের প্রয়োজন হবে না।

এটি দুর্দান্ত ধারণা, যতক্ষণ না আমরা এনকোডিং শুরু করার আগে আমরা যতক্ষণ ডেটা এনকোড করছি তার দৈর্ঘ্যটি আমরা জানি । তবে কী, যদি শব্দের পরিবর্তে আমরা একটি লাইভ ক্যামেরা থেকে ভিডিওটির কয়েকটি অংশ এনকোডিং করি? আমরা প্রতিটি খণ্ডের দৈর্ঘ্য আগেই জানি না।

যদি প্রোটোকল প্যাডিং ব্যবহার করে তবে কোনও দৈর্ঘ্য প্রেরণ করার দরকার পড়বে না। ক্যামেরা থেকে আসার সাথে সাথে ডেটা এনকোড করা যেতে পারে, প্রতিটি খণ্ড প্যাডিংয়ের সাথে শেষ হয়েছিল এবং রিসিভারটি স্ট্রিমটি সঠিকভাবে ডিকোড করতে সক্ষম হবে।

স্পষ্টতই এটি একটি অত্যন্ত স্বতন্ত্র উদাহরণ, তবে সম্ভবত এটি চিত্রিত করে যে প্যাডিং কিছু পরিস্থিতিতে বোধগম্যভাবে কেন সহায়ক হতে পারে।


24
+1 কেবলমাত্র উত্তর যা "যুক্তিসঙ্গত কারণ এবং অযথা কিছু অপ্রয়োজনীয় কারণে আমাদের অপ্রয়োজনীয় পছন্দ" ছাড়াও যুক্তিসঙ্গত উত্তর সরবরাহ করে।
অবৈধ

4
এটি স্পষ্টভাবে এনকোডযুক্ত অংশগুলির জন্য ঠিক আছে, তবে ডিকোডিংয়ের পরে অবিচ্ছিন্নভাবে সংক্ষিপ্ত হয়ে উঠবে বলে আশা করা হচ্ছে। আপনি যদি U0FNSQ == QU0 = প্রেরণ করেন তবে আপনি বাক্যটি পুনর্গঠন করতে পারেন, তবে বাক্যটি বানানো শব্দগুলি আপনি হারাবেন। কিছুই না চেয়ে ভাল, আমার ধারণা। উল্লেখযোগ্যভাবে, জিএনইউ বেস 64 প্রোগ্রামটি স্বয়ংক্রিয়ভাবে সংক্ষিপ্ত এনকোডিংগুলি পরিচালনা করে।
মার্সেলো ক্যান্টোস

4
শব্দের দৈর্ঘ্য যদি 3 এর একক হয়? এই মূর্খ কনটেন্টেশনটি তথ্যকে (শব্দের সমাপ্তি) ধ্বংস করে, প্যাডিং অপসারণ করে না।
গ্রিনস্কেপ

4
বেস 64 কনটেমেটেশনটি এনকোডারগুলিকে অংশের আকারগুলি তিনটির একাধিকতে সারিবদ্ধ করার বোঝা ছাড়াই সমান্তরালভাবে বড় অংশগুলিকে প্রক্রিয়া করার অনুমতি দেয়। একইভাবে, বাস্তবায়নের বিশদ হিসাবে, সেখানে কোনও এনকোডার থাকতে পারে যাতে কোনও আকারের অভ্যন্তরীণ ডেটা বাফারটি ফ্লাশ করা দরকার যা তিনটির একাধিক নয়।
আন্দ্রে ডি

4
এই উত্তরটি আপনাকে ভাবিয়ে তুলতে পারে যে আপনি কেবল একটি ডিকোডারের কাছে দিয়ে "এসকিউ == ক্যু0 = ভিইপিএন" এর মতো কোনও কিছুকে ডিকোড করতে পারেন। আসলে এটি মনে হয় আপনি পারবেন না, উদাহরণস্বরূপ জাভাস্ক্রিপ্ট এবং পিএইচপি বাস্তবায়ন এটি সমর্থন করে না। একটি সংক্ষিপ্ত স্ট্রিং দিয়ে শুরু করে, আপনাকে হয় একবারে 4 বাইট ডিকোড করতে হবে বা প্যাডিং অক্ষরের পরে স্ট্রিংটি বিভক্ত করতে হবে। দেখে মনে হচ্ছে এই বাস্তবায়নগুলি কেবল প্যাডিং চরগুলি উপেক্ষা করে, এমনকি তারা কোনও স্ট্রিংয়ের মাঝখানে থাকে।
রোমান

39

সম্পর্কিত নোটে, আমি আপনার জন্য তৈরি করা সালিসত ভিত্তিক রূপান্তরকরণের জন্য এখানে একটি বেস রূপান্তরকারী। উপভোগ করুন! https://convert.zamicol.com/

প্যাডিং চরিত্রগুলি কী কী?

প্যাডিং অক্ষর দৈর্ঘ্যের প্রয়োজনীয়তা মেটাতে এবং কোনও অর্থ বহন করতে সহায়তা করে।

প্যাডিংয়ের দশমিক উদাহরণ: স্বেচ্ছাসেবী প্রয়োজনীয়তা অনুসারে সমস্ত স্ট্রিং দৈর্ঘ্যে 8 টি অক্ষর হওয়া উচিত, 640 সংখ্যাটি পূর্ববর্তী 0 এর প্যাডিং অক্ষর হিসাবে ব্যবহৃত হয় যার অর্থ নেই, "00000640" carry

বাইনারি এনকোডিং

বাইটের দৃষ্টান্ত: বাইটটি পরিমাপের ডি-ফ্যাক্টো স্ট্যান্ডার্ড ইউনিট এবং কোনও এনকোডিং স্কিম অবশ্যই বাইটের সাথে সম্পর্কিত হতে পারে।

বেস 256 এই দৃষ্টান্তে ঠিক ফিট করে। একটি বাইট বেস 256 এর একটি অক্ষরের সমান।

বেস 16 , হেক্সাডেসিমাল বা হেক্স প্রতিটি অক্ষরের জন্য 4 বিট ব্যবহার করে। একটি বাইট দুটি বেস 16 অক্ষর উপস্থাপন করতে পারে।

বেস 646 বেস 256 এবং বেস 16 এর বিপরীতে বাইটের দৃষ্টান্তে (বা বেস 32 নয়) সমানভাবে খাপ খায় না। সমস্ত বেস 64 অক্ষর একটি পূর্ণ বাইটের 2 টি বিট, 6 বিটগুলিতে উপস্থাপিত হতে পারে।

আমরা বেস 64 হিসাবে এনকোডিং বনাম বাইট প্যারাডিজমকে ভগ্নাংশ হিসাবে উপস্থাপন করতে পারি: প্রতি বাইটে 8 বিটের চেয়ে বেশি অক্ষর 6 বিট । এই ভগ্নাংশটি হ্রাস করা 4 বাইটের বেশি 3 বাইট।

এই অনুপাত, প্রতি 4 বেস64 অক্ষরের জন্য 3 বাইট, বেস 64 এনকোড করার সময় আমরা যে নিয়মটি অনুসরণ করতে চাই তা হ'ল। বেস 64৪ এনকোডিংটি কেবল বেস 16 এবং বেস 256 এর বিপরীতে 3 বাইট বান্ডিল দিয়েও পরিমাপের প্রতিশ্রুতি দিতে পারে যেখানে প্রতিটি বাইট নিজের নিজের মতো করে দাঁড়াতে পারে।

সুতরাং প্যাডিং চরিত্রগুলি ব্যতীত এনকোডিং ঠিকঠাক কাজ করতে পারলেও প্যাডিংকে কেন উত্সাহ দেওয়া হচ্ছে?

যদি কোনও স্ট্রিমটির দৈর্ঘ্য অজানা থাকে বা কোনও ডেটা স্ট্রিম কখন শেষ হয় ঠিক তা জানতে সহায়ক হতে পারে, প্যাডিং ব্যবহার করুন। প্যাডিংয়ের অক্ষরগুলি স্পষ্টভাবে যোগাযোগ করে যে extra অতিরিক্ত স্পটগুলি খালি থাকতে হবে এবং কোনও দ্বিধাগ্রস্থতার বিধান রয়েছে। এমনকি প্যাডিংয়ের সাথে দৈর্ঘ্য অজানা থাকলেও আপনি জানতে পারবেন আপনার ডেটা স্ট্রিমটি কোথায় শেষ হয়।

একটি পাল্টা উদাহরণ হিসাবে, JOSE এর মতো কিছু মান প্যাডিং অক্ষরগুলিকে মঞ্জুরি দেয় না। এই ক্ষেত্রে, যদি কোনও কিছু অনুপস্থিত থাকে তবে কোনও ক্রিপ্টোগ্রাফিক স্বাক্ষর কাজ করবে না বা অন্যান্য বেস বেস 64 অক্ষরগুলি অনুপস্থিত হবে ("।" এর মতো)। যদিও দৈর্ঘ্য সম্পর্কে অনুমানগুলি তৈরি করা হয় নি, প্যাডিংয়ের প্রয়োজন নেই কারণ কিছু ভুল থাকলে এটি কেবল কাজ করে না।

আর বেস 64৪ আরএফসি ঠিক এটাই বলেছে,

কিছু পরিস্থিতিতে, বেস-এনকোডড ডেটাতে প্যাডিং ("=") এর ব্যবহার প্রয়োজন হয় না বা ব্যবহৃত হয় না। সাধারণ ক্ষেত্রে, যখন পরিবহিত তথ্যের আকার সম্পর্কে অনুমান করা যায় না, প্যাডিংয়ের সঠিক ডিকোডড ডেটা পাওয়া যায়।

[...]

বেস 64৪ এর প্যাডিং স্টেপ [...] যদি ভুলভাবে প্রয়োগ করা হয় তবে এনকোডড ডেটার অ-উল্লেখযোগ্য পরিবর্তনের দিকে পরিচালিত করবে। উদাহরণস্বরূপ, যদি ইনপুটটি বেস 64 এনকোডিংয়ের জন্য কেবল একটি অক্টেট হয় তবে প্রথম চিহ্নের সমস্ত ছয়টি বিট ব্যবহৃত হয়, তবে পরবর্তী চিহ্নের প্রথম দুটি বিটই ব্যবহৃত হয়। এই প্যাড বিটগুলি অবশ্যই এনকোডারদের অনুসারে শূন্যে সেট করতে হবে যা নীচের প্যাডিংয়ের বিবরণে বর্ণিত। যদি এই সম্পত্তিটি ধরে না রাখে তবে বেস-এনকোডড ডেটার কোনও প্রথাগত উপস্থাপনা নেই এবং একাধিক বেস-এনকোড স্ট্রিংগুলি একই বাইনারি ডেটাতে ডিকোড করা যায়। যদি এই সম্পত্তি (এবং এই দস্তাবেজে আলোচিত অন্যরা) ধরে রাখে তবে একটি প্রৌon় এনকোডিং নিশ্চিত হয়।

প্যাডিং আমাদের কোনও হারানো বিটের প্রতিশ্রুতি দিয়ে বেস 64 এনকোডিংটি ডিকোড করতে দেয়। প্যাডিং ছাড়া তিনটি বাইট বান্ডলে পরিমাপের সুস্পষ্ট স্বীকৃতি আর নেই। প্যাডিং ছাড়াই আপনি সাধারণত আপনার স্ট্যাকের অন্য কোথাও, যেমন টিসিপি, চেকসাম বা অন্যান্য পদ্ধতির অতিরিক্ত তথ্য ছাড়াই মূল এনকোডিংয়ের সঠিক প্রজননের গ্যারান্টি দিতে পারবেন না।

উদাহরণ

এখানে আরএফসি 4648 ( http://tools.ietf.org/html/rfc4648#section-8 ) ফর্মের উদাহরণ এখানে দেওয়া হয়েছে

"BASE64" ফাংশনের অভ্যন্তরের প্রতিটি অক্ষর একটি বাইট (বেস 256) ব্যবহার করে। আমরা তখন বেস 64 এ অনুবাদ করি।

BASE64("")       = ""           (No bytes used. 0%3=0.)
BASE64("f")      = "Zg=="       (One byte used. 1%3=1.)
BASE64("fo")     = "Zm8="       (Two bytes. 2%3=2.)
BASE64("foo")    = "Zm9v"       (Three bytes. 3%3=0.)
BASE64("foob")   = "Zm9vYg=="   (Four bytes. 4%3=1.)
BASE64("fooba")  = "Zm9vYmE="   (Five bytes. 5%3=2.)
BASE64("foobar") = "Zm9vYmFy"   (Six bytes. 6%3=0.)

এখানে একটি এনকোডার রয়েছে যার সাথে আপনি চারপাশে খেলতে পারেন: http://www.motobit.com/util/base64-decoder-encoder.asp


16
-1 সংখ্যা সিস্টেমগুলি কীভাবে কাজ করে সে সম্পর্কে এটি একটি দুর্দান্ত এবং পুঙ্খানুপুঙ্খ পোস্ট, তবে এনকোডিংটি ছাড়াই পুরোপুরি কীভাবে কাজ করা হবে কেন প্যাডিং ব্যবহৃত হয় তা তা ব্যাখ্যা করে না ।
ম্যাটি ভির্ককুনেন

4
এমনকি আপনি প্রশ্নটি পড়েছেন? আপনি না প্রয়োজন সঠিকভাবে ডিকোড করতে প্যাডিং।
নবীন

4
আমি মনে করি যে এই উত্তরটি এখানে বর্ণিত কারণটির কারণ হিসাবে ব্যাখ্যা করেছে: "আমরা অতিরিক্ত তথ্য ব্যতীত মূল এনকোডিংয়ের সঠিক পুনরুত্পাদনের গ্যারান্টি দিতে পারি না"। এটি সত্যিই সহজ, প্যাডিংটি আমাদের জানতে দিন যে আমরা সম্পূর্ণ এনকোডিং পেয়েছি। প্রতিবার আপনার কাছে 3 বাইট রয়েছে, আপনি নিরাপদে ধরে নিতে পারেন যে এটি ঠিক আছে এবং এটি ডিকোড করুন, আপনি চিন্তা করবেন না, হুম ... সম্ভবত আরও একটি বাইট সম্ভবত এনকোডিং পরিবর্তন করতে চলেছে।
দিদিয়ার এ

@ ডিডিয়ারএ আপনি কীভাবে জানবেন যে বেস 64 স্ট্রিংগুলিতে আরও 3 বাইট নেই? এটিকে ডিকোড করার char*জন্য আপনার স্ট্রিংয়ের আকার বা নাল টার্মিনেটর প্রয়োজন। প্যাডিং অপ্রয়োজনীয়। সুতরাং, ওপি এর প্রশ্ন।
নবীন

4
@ নাভিন আপনি যদি বেস 64৪ বাইটগুলি ডিকোডিং করে থাকেন তবে 3 বাইট প্যাডিং সহ আপনি দৈর্ঘ্যটি জানেন না, আপনি জানেন যে প্রতিবার আপনি 3 বাইট পেয়েছেন আপনি 4 অক্ষর প্রক্রিয়া করতে পারবেন, যতক্ষণ না আপনি স্রোতের শেষ না পৌঁছান। এটি ছাড়া আপনার ব্যাকট্র্যাকের প্রয়োজন হতে পারে, কারণ পরবর্তী বাইটের ফলে পূর্বের অক্ষরটি পরিবর্তিত হতে পারে, সুতরাং এটি নিশ্চিত করা যায় যে আপনি কেবল স্ট্রিমের শেষে পৌঁছে যাওয়ার পরে এটি সঠিকভাবে ডিকোড করেছেন। সুতরাং, এটি খুব দরকারী নয়, তবে এটির কয়েকটি ধারালো মামলা রয়েছে যেখানে আপনি এটি চাইবেন want
দিদিয়ের এ।

2

আধুনিক যুগে এটির খুব বেশি সুবিধা নেই। আসুন আসল historicalতিহাসিক উদ্দেশ্যটি কী হতে পারে তার একটি প্রশ্ন হিসাবে এটি দেখি ।

বেস64 64 এনকোডিংটি 1993 সালের আর্টিসি 1421 সালে তার প্রথম উপস্থিতি তৈরি করে This এই আরএফসিটি প্রকৃতপক্ষে ইমেল এনক্রিপ্ট করার দিকে দৃষ্টি নিবদ্ধ করে এবং বেস 64 একটি ছোট বিভাগে বর্ণিত হয়েছে 4.3.2.4

এই আরএফসি প্যাডিংয়ের উদ্দেশ্য ব্যাখ্যা করে না। মূল উদ্দেশ্যটির উল্লেখ করতে আমাদের নিকটতমতমটি হল এই বাক্য:

একটি বার্তা শেষে সর্বদা একটি সম্পূর্ণ এনকোডিং কোয়ান্টাম সম্পন্ন হয়।

এটি কনডিকেটেশন (শীর্ষস্থানীয় উত্তর এখানে) প্রস্তাব দেয় না, বা প্যাডিংয়ের জন্য একটি সুস্পষ্ট উদ্দেশ্য হিসাবে প্রয়োগের স্বাচ্ছন্দ্য দেয় না। যাইহোক, পুরো বিবরণ বিবেচনা করে, এটি অনুমান করা অযৌক্তিক নয় যে এটির উদ্দেশ্য হ'ল ডিকোডারটি 32-বিট ইউনিট ( "কোয়ান্টা" ) ইনপুট পড়তে সহায়তা করতে পারে । আজ এটির কোনও লাভ নেই, তবে ১৯৯৩ সালে অনিরাপদ সি কোডটি সম্ভবত খুব সম্ভবত এই সম্পত্তিটির সুবিধা নিয়েছিল।


4
প্যাডিংয়ের অভাবে, যখন প্রথম স্ট্রিংয়ের দৈর্ঘ্য তিনটির একক হয় না তখন দুটি স্ট্রিং সংমিশ্রনের প্রচেষ্টা প্রায়শই একটি আপাতদৃষ্টিতে বৈধ স্ট্রিং দেয়, তবে দ্বিতীয় স্ট্রিংয়ের বিষয়বস্তু ভুলভাবে ডিকোড হয়ে যায়। প্যাডিং যুক্ত করা নিশ্চিত করে যে এটি ঘটে না।
সুপারক্যাট

4
@ সুপের্যাট যদি লক্ষ্যটি ছিল তবে প্রতিটি বেস 64 স্ট্রিংটি কেবল একটি একক "=" দিয়ে শেষ করা কি সহজ হবে না? গড় দৈর্ঘ্য আরও কম হবে, এবং এটি ত্রুটিযুক্ত প্রতিরোধকে আটকাতে পারে।
রোমান স্টারকভ

4
গড় দৈর্ঘ্য এর b'Zm9vYmFyZm9vYg==' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy' b'Zm9vYmFyZm9vYmFyZg==' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v' সমান b'Zm9vYmFyZm9vYg=' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy=' b'Zm9vYmFyZm9vYmFyZg=' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v='
স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.