كيفية تحويل مصفوفة البايت إلى سلسلة سداسية عشرية في C#: دليل كامل

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

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

ابدأ الدورة

تحويل البايتات إلى سلاسل والعكس: سحر الترميز السداسي العشري في C#

\n\n

هل تساءلت يومًا كيف يرى الكمبيوتر صورة أو موسيقى أو مجرد ملف نصي؟ كل هذا مجرد سلسلة من البايتات. لكن البايتات ليست مريحة للعرض على المستخدم أو الإرسال في URL. هنا يأتي دور السلسلة السداسية العشرية (hex string) - تمثيل مضغوط وقابل للقراءة للبيانات الثنائية.

\n\n

تخيل: أنت تكتب وحدة تشفير، تعمل مع التجزئات (hashes)، تنقل بيانات ثنائية عبر JSON، أو تسجل محتوى حزمة. وفجأة - بام! - تحتاج إلى تحويل مصفوفة البايتات إلى سلسلة مفهومة. أو العكس، من سلسلة سداسية عشرية لاستعادة البايتات الأصلية. يبدو مألوفًا؟ هذا السؤال هو أحد أكثر الأسئلة شيوعًا على Stack Overflow، واليوم سنحله نهائيًا. مرحبًا بكم في pythonlib.ru - دليلكم في عالم البرمجة.

\n\n

لماذا نحتاج إلى تحويل مصفوفة البايت إلى سلسلة سداسية عشرية؟

\n\n

دعنا نصل إلى صلب الموضوع. مصفوفة البايت (byte[]) هي بيانات خام: أرقام من 0 إلى 255. يصعب على الإنسان قراءتها، وفي بعض البروتوكولات النصية (HTTP، JSON) قد تفسد التنسيق. السلسلة السداسية العشرية تحل المشكلتين:

\n\n
    \n
  • الاكتناز: يتحول البايت الواحد إلى حرفين (مثال: 255 ← "FF").
  • \n
  • الأمان: تبقى في السلسلة أحرف آمنة فقط (0-9، A-F).
  • \n
  • الراحة: سهولة نسخ السلاسل السداسية العشرية ومقارنتها وتسجيلها.
  • \n
\n\n

لابد أنك رأيت هذه السلاسل في تجزئات MD5 أو SHA256 أو في رموز التفويض. الآن أنت تعرف كيف تعمل "تحت الغطاء".

\n\n

الطريقة رقم 1: الكلاسيكية - BitConverter (بسيطة وسريعة)

\n\n

الطريقة الأكثر شيوعًا في C# هي استخدام الفئة المدمجة BitConverter. وهي موجودة في .NET منذ الإصدار الأول وتعمل بدون تعقيدات.

\n\n

تحويل byte[] ← سلسلة سداسية عشرية

\n\n
byte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = BitConverter.ToString(data);\nConsole.WriteLine(hexString); // الإخراج: 0F-1A-FF-00
\n\n

بسيط، أليس كذلك؟ لكن هناك فارق بسيط: يتم إدراج شرطة بين أزواج الأحرف. إذا كانت الشرطة تزعجك، فمن السهل إزالتها:

\n\n
string hexString = BitConverter.ToString(data).Replace("-", "");\nConsole.WriteLine(hexString); // الإخراج: 0F1AFF00
\n\n

الإيجابيات: أقل كود، طريقة مدمجة، مفهومة للمبتدئين.
\nالسلبيات: شرطة إضافية (تحتاج إلى إزالة)، تخصيص ذاكرة بسيط للسلاسل الوسيطة.

\n\n

التحويل العكسي: سلسلة سداسية عشرية ← byte[]

\n\n

أما العملية العكسية فهي أصعب قليلاً. BitConverter يعمل في اتجاه واحد فقط. لكننا لا نستسلم - سنكتب محللًا بسيطًا:

\n\n
public static byte[] HexStringToBytes(string hex)\n{\n    // إزالة الشرط والمسافات المحتملة\n    hex = hex.Replace("-", "").Replace(" ", "");\n    int length = hex.Length;\n    byte[] bytes = new byte[length / 2];\n    for (int i = 0; i < length; i += 2)\n    {\n        bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);\n    }\n    return bytes;\n}\n\n// الاستخدام:\nstring hex = "0F1AFF00";\nbyte[] result = HexStringToBytes(hex);\n// النتيجة: { 0x0F, 0x1A, 0xFF, 0x00 }
\n\n

تستخدم هذه الطريقة Convert.ToByte مع الأساس 16 - موثوقة وقابلة للقراءة. لكن للمصفوفات الكبيرة، Substring ينشئ العديد من السلاسل المؤقتة. لكود الإنتاج، من الأفضل استخدام Span<T> أو حلقة مع فهرسة الأحرف.

\n\n

الطريقة رقم 2: الحديثة - Convert.ToHexString (.NET 5+)

\n\n

بدءًا من .NET 5، أضافت Microsoft الطريقة المنتظرة Convert.ToHexString. إنها تعمل بسرعة وبدون شرط.

\n\n
byte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = Convert.ToHexString(data);\nConsole.WriteLine(hexString); // الإخراج: 0F1AFF00
\n\n

جميل! لا شرط، ولا Replace. وللعملية العكسية يوجد Co

المدونات

توصيات الكتب