Base64 في C#: ترميز وفك ترميز السلاسل النصية مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

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\n

Base64 هي طريقة لتمثيل البيانات الثنائية (البايتات) كسلسلة نصية ASCII. تتكون الأبجدية من 64 حرفًا: A-Z، a-z، 0-9، بالإضافة إلى الرمزين '+' و '/'. غالبًا ما يُضاف الرمز '=' في نهاية السلسلة للمحاذاة.

\n\n

أين يُستخدم:

\n
    \n
  • نقل البيانات في JSON/XML — لا يمكن إدراج البيانات الثنائية مباشرة، فقط كسلسلة نصية
  • \n
  • المصادقة — يستخدم Basic Auth Base64 لترميز اسم المستخدم وكلمة المرور
  • \n
  • تخزين الصور في قاعدة البيانات — تُخزَّن الصور الصغيرة مباشرة في قاعدة البيانات كـ Base64
  • \n
  • مرفقات البريد الإلكتروني — يتطلب تنسيق MIME استخدام Base64 للملفات الثنائية
  • \n
\n\n

في C#، الفئة المسؤولة عن كل هذا هي System.Convert — أداتك الرئيسية للعمل مع Base64.

\n\n

كيفية ترميز سلسلة نصية إلى Base64 في C#

\n\n

السيناريو الأكثر شيوعًا: لديك سلسلة نصية عادية (مثل "مرحباً بالعالم!")، وتريد الحصول على تمثيلها بصيغة Base64.

\n\n

إليك كيفية القيام بذلك:

\n\n
using 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\n
using 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\n

Base64 لا يقتصر على السلاسل النصية. يمكنك ترميز أي بيانات ثنائية — مثل صورة أو ملف PDF.

\n\n

مثال: ترميز مصفوفة بايتات إلى Base64

\n\n
byte[] imageBytes = File.ReadAllBytes("photo.jpg");\nstring base64Image = Convert.ToBase64String(imageBytes);\n\n// الآن يمكن حفظ السلسلة النصية في JSON أو إرسالها عبر API\nConsole.WriteLine($"طول سلسلة Base64: {base64Image.Length} حرف");
\n\n

فك الترميز إلى ملف:

\n\n
string 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

المدونات

توصيات الكتب