هذا المقال يتطلب مستوى: مبتدئ
Base64: ليه تحويل بيانات ثنائية لنص بيكبّر الحجم 33%
لو رفعت صورة حجمها 3 ميجا في إيميل ووصلت للطرف التاني 4 ميجا، ده مش عطل ولا ضغط فاشل. ده ترميز اسمه Base64، وبعد المقال ده هتعرف ليه بيحصل بالظبط، وإمتى تستخدمه وإمتى تبعد عنه.
المشكلة باختصار
فيه قنوات نقل قديمة مبنية على إنها تشيل نص بس: حروف وأرقام وعلامات بسيطة. أشهر مثال هو بروتوكول الإيميل (SMTP) اللي اتصمم أصلاً للنصوص الإنجليزية (7-bit). الصورة أو ملف الـ PDF مش نص، دول بايتات ممكن تاخد أي قيمة من 0 لـ 255. لو بعتهم زي ما هم، القناة ممكن تفسّر بايت منهم على إنه أمر تحكّم وتبوّظ الملف. Base64 بيحل ده: بياخد أي بايتات ويترجمها لنص آمن بحروف وأرقام بس.
الفكرة بمثال للمبتدئ
تخيّل إنك عايز تبعت صورة لصاحبك، بس القناة الوحيدة المتاحة بطاقة بريدية بتسمح تكتب فيها حروف إنجليزية وأرقام بس، ممنوع ترسم. هتعمل إيه؟ هتقسّم الصورة لمربعات صغيرة، وكل مربع توصفه بكود من حروف وأرقام متفق عليه مع صاحبك. هو في الآخر هيقرا الحروف ويعيد تركيب الصورة. انت كده حوّلت رسمة لـ نص تقدر القناة تشيله. ده بالظبط اللي Base64 بيعمله: بيحوّل بايتات لا تقدر القناة تشيلها، إلى حروف تقدر تشيلها. الثمن إن الوصف بالحروف بياخد مساحة أكبر شوية من الرسمة الأصلية.
الشرح العلمي: 3 بايت بيبقوا 4 محارف
دلوقتي نفهم الرقم 33% منين جه بالظبط. كل بايت = 8 بِت. Base64 بيشتغل على البِت مش على البايت. بياخد كل 3 بايت = 24 بِت، ويعيد تقسيمهم لـ 4 مجموعات، كل مجموعة 6 بِت. كل مجموعة من الـ 6 بِت قيمتها بين 0 و 63 (لإن 2 أس 6 = 64). وعشان كده اسمه Base64: عنده 64 رمز جاهز (A حتى Z، ثم a حتى z، ثم 0 حتى 9، ثم + و /). كل قيمة بتتحول للرمز اللي يقابلها.
خد المثال الكلاسيكي: كلمة Man. الحروف دي قيمها بالـ ASCII هي 77 و 97 و 110، يعني بالبِت:
M = 01001101 a = 01100001 n = 01101110
نجمعهم: 0100 1101 0110 0001 0110 1110 (24 بِت)
نعيد التقسيم لـ 6 بِت: 010011 010110 000101 101110
القيم: 19 22 5 46
الرموز: T W F u
فكلمة Man (3 بايت) بقت TWFu (4 محارف). دخلنا 3، طلعنا 4. النسبة 4 على 3 = 1.33، يعني زيادة 33% بالظبط. دي مش مصادفة ولا عيب في الأداة، دي طبيعة التحويل نفسه.
جرّبها بنفسك بكود شغّال
الكود ده بـ Python، من غير أي مكتبات خارجية، بيوريك التحويل ويقيس الزيادة بالأرقام:
import base64
data = b"Man"
encoded = base64.b64encode(data)
print(encoded)
print(base64.b64decode(encoded))
raw = b"x" * 3000
enc = base64.b64encode(raw)
print(len(raw), len(enc))
print(round((len(enc)/len(raw) - 1) * 100))
3000 بايت طلعوا 4000 محرف. الزيادة 1000 محرف، يعني 33% بالظبط زي ما الحسبة قالت.
سيناريوهات واقعية بتقابلك فعلاً
- مرفقات الإيميل: أي صورة أو ملف بتبعته في إيميل بيتحوّل Base64 جوه رسالة الـ MIME. صورة 4 ميجا بتشغل تقريبًا 5.3 ميجا في جسم الإيميل. عشان كده الإيميلات بمرفقات بتبان أتقل من حجم الملف الأصلي.
- data URI داخل الـ CSS أو HTML: ساعات بتلاقي صورة صغيرة مكتوبة جوه الكود على شكل سلسلة Base64 طويلة بادئة بـ data:image. ده بيوفّر طلب شبكة منفصل للصورة، بس بيكبّر حجم ملف الـ CSS بنسبة الـ 33%.
- الـ JWT: لو فتحت توكن تسجيل دخول، هتلاقيه 3 أجزاء مفصولة بنقطة، كل جزء متشفّر بنسخة من Base64 اسمها base64url. مش تشفير، مجرد ترميز تقدر ترجعه.
الـ trade-off: بتكسب إيه وبتخسر إيه
بتكسب إن بياناتك الثنائية بقت نص آمن يعدّي في أي قناة بتشيل نص بس، من غير ما يتبوّظ. بتخسر حاجتين: زيادة 33% في الحجم، ووقت معالجة بسيط للترميز وفك الترميز على الطرفين. لملف صغير مش هتحس بالفرق. لكن لو بتبعت آلاف الملفات الكبيرة في الثانية، الـ 33% دي بتتحوّل لباندويدث وفلوس حقيقية على فاتورتك.
متى لا تستخدم Base64
متستخدموش لما القناة بتدعم البيانات الثنائية أصلاً. مثلاً لو بترفع ملف عبر HTTP بنوع multipart/form-data، الـ HTTP بيشيل binary عادي، فترميزه Base64 هنا بيكبّر الحجم 33% على الفاضي من غير أي فايدة. وأهم نقطة: Base64 مش تشفير ومش أمان. أي حد يقدر يفك ترميزه في ثانية. لو عايز تخفي بيانات، محتاج تشفير حقيقي زي AES، مش Base64.
الخطوة التالية
افتح الترمنال وشغّل كود الـ Python اللي فوق، وغيّر الكلمة Man لاسمك بالإنجليزي وشوف بيطلع إيه. بعدين جرّب تبعت 1 بايت بس وهتلاقي في الآخر علامة أو علامتين يساوي؛ دي حشو (padding) بيكمّل المجموعة الأخيرة لـ 4 محارف لما البايتات مش من مضاعفات 3. لو طلع عندك ناتج مختلف، ابعتلي المدخل اللي استخدمته.
المصادر
- RFC 4648 — The Base16, Base32, and Base64 Data Encodings (IETF): الوصف الرسمي للترميز وجدول الرموز والـ padding.
- توثيق Python الرسمي — وحدة base64 (دالتا b64encode و b64decode).
- MDN Web Docs — مقالا Base64 و btoa لشرح الترميز في المتصفح و data URIs.
- RFC 2045 — MIME: ليه مرفقات الإيميل بتتشفّر Base64 فوق قناة 7-bit.