آموزش Base64 در پایتون؛ نحوه Encode و Decode کردن دادهها
ماژول base64 یکی از ماژولهای استاندارد و کاربردی پایتون است که برای تبدیل دادههای باینری به رشتههای قابلانتقال و برعکس استفاده میشود. اگر با وب، API، JWT، فایل، تصویر، احراز هویت یا رمزنگاری کار میکنید، احتمالاً با Base64 زیاد کار خواهید کرد.
اگر نمیدانید باینری چیست، ویدیو آموزش اعداد باینری را تماشا کنید.
Base64 یک روش Encoding است، نه Encryption. یعنی هدفش این نیست که اطلاعات را مخفی یا امن کند؛ بلکه داده باینری را به مجموعهای از کاراکترهای متنی تبدیل میکند که انتقال و ذخیرهسازی آنها راحتتر باشد.
import base64
text = "Hello"
encoded = base64.b64encode(text.encode())
print(encoded)
خروجی به شکل زیر خواهد بود:
b'SGVsbG8='
حالا میتوانیم آن را دوباره به متن اصلی تبدیل کنیم:
decoded = base64.b64decode(encoded)
print(decoded)
# OUTPUT
b'Hello'
و برای تبدیل به str میتوانید به شکل زیر کار کنید:
print(decoded.decode())
# OUTPUT
Hello
دوره پیشنهادی: دوره آموزش الگوریتم نویسی برای مصاحبه شغلی پایتون
# ماژول Base64 پایتون چه کاربردی دارد؟
ممکن است برای شما سوال باشد که چرا اصلا باید داده باینری را کاراکتر های ASCII تبدیل کنیم. فرض کنید میخواهید یک تصویر را داخل یک JSON ارسال کنید.تصویر در اصل دادهی باینری است. ولی JSON اساساً برای انتقال دادههای متنی طراحی شده است.
Base64 میتواند این داده را به چیزی شبیه این تبدیل کند:
iVBORw0KGgoAAAANSUhEUgAA...
حالا میتوانید این رشته را داخل JSON قرار دهید:
{
"image": "iVBORw0KGgoAAAANSUhEUgAA..."
}
سمت دریافت کننده میتواند آن را Decode کرده و دوباره فایل باینری را به دست آورد.
# ماژول Base64 پایتون چطور کار میکند؟
ماژول Base64 از 64 کاراکتر اصلی ASCII استفاده میکند که به شرح زیر است:
A-Z
a-z
0-9
+
/
مجموع این کاراکترها 64 خواهد شد.
یک نکته مهم این است که Base64 حجم داده را کاهش نمیدهد؛ برعکس، معمولاً حجم را حدود ۳۳٪ افزایش میدهد. مثلاً:
Original: 100 bytes
Base64: ~136 bytes
پس Base64 برای فشردهسازی نیست.
# مهمترین توابع ماژول Base64
ماژول Base64 توابع زیادی دارد اما در پروژههای واقعی، بیشترین استفاده معمولاً این توابع هستند:
b64encode()
b64decode()
urlsafe_b64encode()
urlsafe_b64decode()
مقاله پیشنهادی: یونیکد و رمزگذاری کاراکتر در پایتون
+ تابع b64encode
این تابع برای encode کردن داده های استفاده میشود:
import base64
data = b"Hello World"
result = base64.b64encode(data)
print(result)
# OUTPUT
b'SGVsbG8gV29ybGQ='
دقت کن که خروجی یک bytes است، نه str . اگر رشته میخواهی باید تبدیل کنی:
result = base64.b64encode(data).decode()
print(result)
دقت کن که تابع b64encode مستقیماً str قبول نمیکند. باید ابتدا آن را به bytes تبدیل کنیم:
text = "Hello"
encoded = base64.b64encode(text.encode())
print(encoded)
+ تابع b64decode
این داده برعکس Encode است و داده های متنی را به باینری تبدیل میکند. مثلا:
import base64
encoded = b"SGVsbG8="
decoded = base64.b64decode(encoded)
print(decoded)
خروجی به شکل bytes است و اگر میخواهید نوع داده رشته داشته باشید:
decoded = base64.b64decode(encoded).decode()
print(decoded)
+ تابع urlsafe_b64encode
Base64 معمولی از دو کاراکتر /+ استفاده میکند. این کاراکترها در URL میتوانند مشکلساز شوند. برای همین Python یک نسخه URL-safe دارد. با تابع urlsafe_b64encode به جای کاراکتر + از - و به جای کاراکتر / از _ استفاده میکند.
مثلا:
import base64
data = b"hello world"
encoded = base64.urlsafe_b64encode(data)
print(encoded)
و بعد برای decode کردن به شکل زیر کار کنید:
decoded = base64.urlsafe_b64decode(encoded)
print(decoded)
ویدیو پیشنهادی: تفاوت بین str و repr در پایتون
# ماژول Base64 و Unicode
Base64 روی bytes کار میکند، بنابراین برای فارسی ابتدا باید Encoding انجام دهیم. مثلاً:
import base64
text = "ایند مالس"
encoded = base64.b64encode(text.encode("utf-8"))
print(encoded)
و بعد:
decoded = base64.b64decode(encoded)
print(decoded.decode("utf-8"))
ویدیو پیشنهادی: فایل در پایتون
# ماژول Base64 و کار با فایل
یکی از کاربردهای مهم Base64 تبدیل فایل به رشته است. مثلاً یک تصویر داریم و میخواهیم این فایل باینری را به متن ASCII تبدیل کنیم:
import base64
with open("image.jpg", "rb") as file:
data = file.read()
encoded = base64.b64encode(data)
print(encoded)
حالا encoded شامل محتوای Base64 تصویر است.
برای تبدیل متن ASCII به عکس اولیه باید عملیات را برعکس انجام دهید:
import base64
with open("image.jpg", "rb") as file:
encoded = base64.b64encode(file.read())
decoded = base64.b64decode(encoded)
with open("new_image.jpg", "wb") as file:
file.write(decoded)
در نتیجه فایل جدید از نظر داده با فایل اصلی یکسان خواهد بود.
# تفاوت Encoding و Encryption
این قسمت مهم است. هدف از Encoding تبدیل فرمت داده است ولی هدف Encryption محافظت از داده با استفاده از یک کلید است.
مثلا در Encoding:
Hello
↓
SGVsbG8=
اما در Encryption:
Hello
↓
Encrypted Data
و برای رمزگشایی نیاز به Key داریم.
# یک نکته درباره عملکرد Base64
اگر فایل بزرگی دارید، معمولاً Base64 انتخاب خوبی نیست. مثلاً یک فایل 10MB ممکن است بعد از Base64 به حجم 13.3MB برسد. ضمن اینکه Encoding و Decoding هم CPU و هم Memory مصرف میکند. برای فایلهای بزرگ معمولاً بهتر است فایل را به صورت واقعی با :
multipart/form-data
ارسال کنی.
Base64 بیشتر برای مواردی مثل:
- Tokenها
- دادههای کوچک
- JSON
- تصاویر کوچک
- Data URI
- بعضی APIها
- انتقال دادههای باینری در محیطهای متنی
مناسب است.
# نتیجه گیری
در این آموزش، با ماژول Base64 در پایتون بهصورت کامل آشنا شدید و یاد گرفتید چگونه دادههای متنی و باینری را با استفاده از base64 به فرمت Base64 تبدیل کرده و مجدداً Decode کنید. نحوه استفاده از توابع b64encode و b64decode، تبدیل و ذخیره فایلها به Base64، کار با Base64URL و کاربردهای آن در APIها، JWT، احراز هویت و انتقال دادههای باینری را بررسی کردیم.
ارسال نظر