مستوى المقال: متوسط. محتاج تكون عارف يعني إيه بايت وبت، وكتبت كود بسيط بأي لغة قبل كده. مش لازم تكون خبير.
Base64: ليه الملف بيتحوّل لنص وبيكبر الثلث
لو بعتّ صورة جوه رسالة أو خزّنتها في حقل JSON ولقيتها بقت نص طويل زي iVBORw0KGgo... وحجمها زاد حوالي الثلث، ده مش خلل. ده ترميز Base64 بيشتغل بالظبط زي ما المفروض. المقال ده هيخليك تعرف امتى تستخدمه وامتى تبعد عنه، وليه بيكلّفك 33% زيادة في الحجم.
المشكلة باختصار
فيه قنوات نقل قديمة اتبنت علشان تنقل نص بس: الإيميل (SMTP)، وبعض ترويسات HTTP، وملفات إعدادات زي JSON وXML. القنوات دي بتتعامل مع بايتات معينة كأوامر تحكّم مش كبيانات. لو بعتّ بايت خام لصورة أو ملف مضغوط، فيه بايتات ممكن القناة تفسّرها غلط أو تقطعها. النتيجة: الملف بيوصل تالف. Base64 بيحل ده بإنه يحوّل أي بايتات لنص من 64 رمز آمن بس، بيعدّي من غير ما يتلخبط.
المفهوم بمثال بسيط الأول
تخيّل مكتب بريد قديم بيرفض يشحن أي طرد فيه حاجة غير الحروف والأرقام. عندك لوحة رخامية عايز تبعتها. مش هيعدّوها. الحل: بدل ما تبعت اللوحة نفسها، تكتب وصف دقيق ليها بالحروف بس: "مستطيل، 30 في 40، الحرف الأول محفور في الركن..."، والطرف التاني يعيد نحتها من الوصف. الوصف أطول من اللوحة الأصلية، بس بيعدّي من غير مشاكل.
Base64 بيعمل نفس الحاجة. البيانات الأصلية (بايتات) هي اللوحة. الوصف المكتوب بالحروف هو نص Base64. الطرف التاني بيفكّ الوصف ويرجّع البايتات زي ما هي بالظبط. مفيش فقدان، بس فيه زيادة في الطول.
المفهوم علميًا: 3 بايت بيبقوا 4 رموز
البايت الواحد 8 بت. Base64 بيشتغل على 6 بت في المرة، علشان 2 أُس 6 يساوي 64 رمز بالظبط، وده مصدر الاسم. الخوارزمية بتاخد كل 3 بايت (24 بت)، وتقسّمهم لأربع مجموعات، كل مجموعة 6 بت. كل مجموعة رقم من 0 لـ 63، وكل رقم بيتحوّل لرمز من الجدول: A–Z ثم a–z ثم 0–9 ثم + و /.
ركز في الحساب: دخل 3 بايت، خرج 4 رموز. كل رمز محتاج بايت لتخزينه كنص. يعني 3 بايت أصلية بقت 4 بايت. الزيادة 1 على 3، يعني 33% بالظبط. دي مش مصادفة ولا هدر عشوائي، دي طبيعة الترميز نفسه.
مثال تنفيذي شغّال
الكود ده يشفّر ويفك كلمة، وبعدين يقيس الزيادة في الحجم على ملف حقيقي:
import base64
# تشفير وفك بسيط
raw = "Man".encode("utf-8") # 3 بايت
encoded = base64.b64encode(raw) # b'TWFu' -- 4 رموز
decoded = base64.b64decode(encoded) # يرجّع b'Man' بالظبط
print(encoded.decode(), decoded.decode()) # TWFu Man
# قياس الزيادة على صورة حقيقية
with open("photo.jpg", "rb") as f:
data = f.read()
b64 = base64.b64encode(data)
overhead = (len(b64) - len(data)) / len(data) * 100
print(f"الأصلي: {len(data):,} بايت")
print(f"بعد Base64: {len(b64):,} بايت")
print(f"الزيادة: {overhead:.1f}%") # حوالي 33.3%