সংক্ষিপ্ত উত্তর
আপনি একটি ধাক্কা প্রয়োজন bytes-like
বস্তু ( bytes
, bytearray
করতে, ইত্যাদি) base64.b64encode()
পদ্ধতি। এখানে দুটি উপায় রয়েছে:
>>> data = base64.b64encode(b'data to be encoded')
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
অথবা একটি পরিবর্তনশীল সহ:
>>> string = 'data to be encoded'
>>> data = base64.b64encode(string.encode())
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
কেন?
পাইথন 3 সালে str
বস্তু সি-শৈলী চরিত্র অ্যারে (তাই তারা নয় না অ্যারে বাইট), কিন্তু এর পরিবর্তে, তারা ডাটা স্ট্রাকচার যে কোনো সহজাত এনকোডিং হবে না হয়। আপনি বিভিন্নভাবে এই স্ট্রিংটিকে (বা এটি ব্যাখ্যা করতে) এনকোড করতে পারেন। সর্বাধিক প্রচলিত (এবং পাইথন 3-এ ডিফল্ট) হল utf-8, বিশেষত যেহেতু এটি ASCII এর সাথে পিছনের দিকে সামঞ্জস্যপূর্ণ (যদিও এটি বহুল ব্যবহৃত-ব্যবহৃত এনকোডিংগুলি রয়েছে)। আপনি যখন এটি গ্রহণ করেন string
এবং সেই .encode()
পদ্ধতিটি কল করেন তখন এটিই ঘটে থাকে: পাইথন utf-8 (ডিফল্ট এনকোডিং) এ স্ট্রিংটির ব্যাখ্যা দিচ্ছে এবং আপনাকে এটির সাথে মিলিয়ে বাইটের অ্যারে সরবরাহ করছে।
পাইথন 3 -তে বেস-64৪ এনকোডিং
মূলত প্রশ্ন শিরোনাম বেস -৪ 64 এনকোডিং সম্পর্কে জিজ্ঞাসা করেছিল। বেস-64 stuff স্টাফের জন্য পড়ুন।
base64
এনকোডিংয়ে--বিট বাইনারি খণ্ড নেয় এবং এজেড, এজ, ০-৯, '+', '/', এবং '=' অক্ষর ব্যবহার করে তাদের এনকোড করে (কিছু এনকোডিংগুলি '+' এবং '/' এর জায়গায় বিভিন্ন অক্ষর ব্যবহার করে) । এটি একটি চরিত্রের এনকোডিং যা মূলত -৪৪ বা বেস-64৪ নম্বর সিস্টেমের গাণিতিক নির্মাণের ভিত্তিতে নির্মিত তবে সেগুলি খুব আলাদা different গণিতে বেস-64৪ হ'ল বাইনারি বা দশমিকের মতো একটি সংখ্যা সিস্টেম এবং আপনি পুরো সংখ্যাটিতে র্যাডিক্সের এই পরিবর্তনটি করেন, বা (যদি আপনি যে রেডিক্সটি রূপান্তর করছেন তবে 64৪ এর চেয়ে কম 2 এর শক্তি) ডান থেকে অংশে পড়ে থাকবে।
ইন base64
এনকোডিং, অনুবাদ বাঁ দিক থেকে ডানদিকে সম্পন্ন করা হয়; এই প্রথম 64 টি অক্ষরকে কেন এটি base64
এনকোডিং বলা হয় । Th৫ তম '=' চিহ্নটি প্যাডিংয়ের জন্য ব্যবহৃত হয়, যেহেতু এনকোডিংটি ch-বিট খণ্ডগুলি টান দেয় তবে সাধারণত যে ডেটাটি এনকোড করতে বোঝানো হয় তা হ'ল 8-বিট বাইট হয়, তাই কখনও কখনও শেষ খণ্ডে মাত্র 2 বা 4 বিট থাকে।
উদাহরণ:
>>> data = b'test'
>>> for byte in data:
... print(format(byte, '08b'), end=" ")
...
01110100 01100101 01110011 01110100
>>>
যদি আপনি সেই বাইনারি ডেটাটিকে একটি একক পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করেন, তবে আপনি এটিই বেস -10 এবং বেস--৪ (বেস-64৪ এর টেবিল ) এ রূপান্তর করবেন :
base-2: 01 110100 011001 010111 001101 110100 (base-64 grouping shown)
base-10: 1952805748
base-64: B 0 Z X N 0
base64
এনকোডিং যদিও এইভাবে এই ডেটাটিকে পুনরায় গ্রুপ করবে:
base-2: 011101 000110 010101 110011 011101 00(0000) <- pad w/zeros to make a clean 6-bit chunk
base-10: 29 6 21 51 29 0
base-64: d G V z d A
সুতরাং, 'B0ZXN0' হ'ল আমাদের বাইনারি, গাণিতিকভাবে বলার বেস-64 base সংস্করণ। যাইহোক, base64
এনকোডিংকে বিপরীত দিকে এনকোডিং করতে হয় (সুতরাং কাঁচা ডেটাটি 'ডিজিভিজেডএ'তে রূপান্তরিত হয়) এবং শেষদিকে কতটা জায়গা ছেড়ে যায় তা অন্যান্য অ্যাপ্লিকেশনগুলিকে জানানোরও একটি বিধি রয়েছে। এটি '=' চিহ্ন সহ প্রান্ত প্যাডিং দ্বারা সম্পন্ন হয়। সুতরাং, base64
এই ডেটাটির এনকোডিংটি 'dGVzdA ==', দুটি '=' চিহ্ন সহ দুটি জোড় বিট নির্দেশ করে যখন এই ডেটাটি মূল ডেটার সাথে মিলে যায় তখন ডিকোড হয়ে যায়।
আসুন আমি পরীক্ষা করে দেখি যে আমি বেonমান হয়ে যাচ্ছি:
>>> encoded = base64.b64encode(data)
>>> print(encoded)
b'dGVzdA=='
base64
এনকোডিং কেন ব্যবহার করবেন ?
ধরা যাক এই ডেটার মতো ইমেলের মাধ্যমে আমাকে কারও কাছে কিছু তথ্য প্রেরণ করতে হবে:
>>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20'
>>> print(data.decode())
>>> print(data)
b'\x04msg\x08\x08\x08 '
>>>
আমি লাগানো দুটি সমস্যা আছে:
- যদি আমি ইউনিক্সে সেই ইমেলটি প্রেরণের চেষ্টা করি,
\x04
চরিত্রটি পড়ার সাথে সাথে ইমেলটি প্রেরণ করা হত , কারণ এটি END-OF-TRANSMISSION
(সিটিআরএল-ডি) জন্য ASCII , সুতরাং বাকী ডেটা সংক্রমণের বাইরে থাকবে।
- এছাড়াও, যখন পাইথন আমার সমস্ত অশুভ নিয়ন্ত্রণের অক্ষরগুলি থেকে রেহাই পেতে যথেষ্ট স্মার্ট, যখন আমি সরাসরি তথ্য প্রিন্ট করি, যখন সেই স্ট্রিংটি ASCII হিসাবে ডিকোড করা হয়, আপনি দেখতে পাবেন যে 'msg' নেই। কারণ 'আমি ' মুছে ফেলতে আমি তিনটি
BACKSPACE
অক্ষর এবং তিনটি SPACE
অক্ষর ব্যবহার করেছি । সুতরাং, আমার EOF
সেখানে অক্ষর না থাকলেও শেষ ব্যবহারকারী পর্দার পাঠ্য থেকে আসল, কাঁচা ডেটাতে অনুবাদ করতে পারবেন না।
এটি কেবলমাত্র কাঁচা ডেটা প্রেরণে কতটা শক্ত হতে পারে তা আপনাকে দেখানোর জন্য এটি একটি ডেমো। বেস 6464 ফর্ম্যাটে ডেটা এনকোডিং আপনাকে সঠিক একই তথ্য দেয় তবে এমন ফর্ম্যাটে যা নিশ্চিত করে যে এটি ইমেল হিসাবে ইলেকট্রনিক মিডিয়াতে প্রেরণে নিরাপদ।