Base64 في C#: كيفية ترميز وفك ترميز السلاسل النصية دون صداع
\n\nهل سبق لك أن واجهت موقفًا تحتاج فيه إلى نقل بيانات ثنائية عبر بروتوكول نصي، أو إرسال صورة في JSON، أو حفظ تجزئة (hash) بشكل قابل للقراءة؟ هنا يأتي دور Base64 — التنسيق القديم، الجيد، والموثوق الذي يحول أي بايتات إلى نص آمن.
\n\nالسؤال "How do I encode and decode a base64 string?" هو أحد أكثر الأسئلة شيوعًا على Stack Overflow (عشرات الآلاف من المشاهدات). وليس من دون سبب: في C#، يبدو العمل مع Base64 بسيطًا، لكن المزالق الخفية تظهر في كل خطوة. اليوم سنشرح كل شيء من الألف إلى الياء: من الأمثلة الأساسية إلى حالات الاستخدام الواقعية في بيئة الإنتاج.
\n\nما هو Base64 ولماذا هو مطلوب؟
\n\nBase64 هي طريقة لتمثيل البيانات الثنائية (البايتات) كسلسلة نصية ASCII. تتكون الأبجدية من 64 حرفًا: A-Z، a-z، 0-9، بالإضافة إلى الرمزين '+' و '/'. غالبًا ما يُضاف الرمز '=' في نهاية السلسلة للمحاذاة.
\n\nأين يُستخدم:
\n- \n
- نقل البيانات في JSON/XML — لا يمكن إدراج البيانات الثنائية مباشرة، فقط كسلسلة نصية \n
- المصادقة — يستخدم Basic Auth Base64 لترميز اسم المستخدم وكلمة المرور \n
- تخزين الصور في قاعدة البيانات — تُخزَّن الصور الصغيرة مباشرة في قاعدة البيانات كـ Base64 \n
- مرفقات البريد الإلكتروني — يتطلب تنسيق MIME استخدام Base64 للملفات الثنائية \n
في C#، الفئة المسؤولة عن كل هذا هي System.Convert — أداتك الرئيسية للعمل مع Base64.
كيفية ترميز سلسلة نصية إلى Base64 في C#
\n\nالسيناريو الأكثر شيوعًا: لديك سلسلة نصية عادية (مثل "مرحباً بالعالم!")، وتريد الحصول على تمثيلها بصيغة Base64.
إليك كيفية القيام بذلك:
\n\nusing System;\nusing System.Text;\n\nstring original = "Hello, World!";\nbyte[] bytes = Encoding.UTF8.GetBytes(original);\nstring base64 = Convert.ToBase64String(bytes);\n\nConsole.WriteLine(base64); // الإخراج: SGVsbG8sIFdvcmxkIQ==\n\nنقطة مهمة: Base64 يعمل مع البايتات، وليس مع السلاسل النصية. لذلك نقوم أولاً بتحويل السلسلة النصية إلى مصفوفة بايتات (باستخدام ترميز UTF-8)، ثم نقوم بترميز هذه البايتات.
\n\nلماذا UTF-8 وليس ASCII مثلاً؟ لأن UTF-8 يدعم جميع أحرف Unicode، بما في ذلك الأحرف العربية والهيروغليفية والرموز التعبيرية. إذا استخدمت ASCII مع سلاسل نصية عربية، فستفقد البيانات.
\n\nكيفية فك ترميز Base64 إلى سلسلة نصية
\n\nالعملية العكسية — فك الترميز — تبدو متماثلة:
\n\nusing System;\nusing System.Text;\n\nstring base64 = "SGVsbG8sIFdvcmxkIQ==";\nbyte[] bytes = Convert.FromBase64String(base64);\nstring decoded = Encoding.UTF8.GetString(bytes);\n\nConsole.WriteLine(decoded); // الإخراج: Hello, World!\n\nلاحظ: إذا قمت بترميز السلسلة النصية باستخدام UTF-8، فيجب فك ترميزها باستخدام UTF-8 أيضًا. وإلا ستحصل على أحرف مشوشة.
\n\nالعمل مع البيانات الثنائية (الصور، الملفات)
\n\nBase64 لا يقتصر على السلاسل النصية. يمكنك ترميز أي بيانات ثنائية — مثل صورة أو ملف PDF.
\n\nمثال: ترميز مصفوفة بايتات إلى Base64
\n\nbyte[] imageBytes = File.ReadAllBytes("photo.jpg");\nstring base64Image = Convert.ToBase64String(imageBytes);\n\n// الآن يمكن حفظ السلسلة النصية في JSON أو إرسالها عبر API\nConsole.WriteLine($"طول سلسلة Base64: {base64Image.Length} حرف");\n\nفك الترميز إلى ملف:
\n\nstring base64Image = "..."; // سلسلتك النصية\nbyte[] imageBytes = Convert.FromBase64String(base64Image);\nFile.WriteAllBytes("decoded_photo.jpg", imageBytes);\n\nمهم: Base64 يزيد حجم البيانات بنسبة 33% تقريبًا. إذا كانت لديك صورة بحجم 1 ميجابايت، فبعد الترميز سيكون وزنها ~1.33 ميجابايت كسلسلة نصية.
\n\nالأخطاء النموذجية وكيفية تجنبها
\n\nحتى المطورون ذوو الخبرة قد يتعثرون أحيانًا مع Base64. إليك أكثر المزالق شيوعًا:
\n\n