في لغة C و ++C نستطيع الإعلان عن متغيرات من نوع char، والتي تحمل محرفاً وحيداً بحجم بايت واحد فقط. كما نستطيع كتابة النصوص كسلسلة من المحارف المتتالية. كمثال:
char myChar = 'w'; // محرف وحيد
char anotherChar = '3'; // محرف وحيد آخر
char *text = "welcome"; // نص، سلسلة محارف
نلاحظ كيف أن المحرف يتم تحديده بوضعه بين فاصلتين أحاديتين كما في 'w' . أما النصوص فتوضع بين علامتي تنصيص أو اقتباس "welcome" . أعقد أن جميع من يبرمجون بلغة ++C يعرفون هذه المعلومات الأساسية. الآن إليكم الكود التالي:
int text = 'why?'; // نص، لكن بدون علامات اقتباس؟
جربوا وضع السطر أعلاه في برنامج ++C، وانظروا إن كان سيعتبره المترجم خطأ…
ها؟ ماذا وجدتم؟
لا توجد أية أخطاء ؟!
فعلاً! المترجم مصرّ على أن السطر صحيح ولا خطأ فيه. ولكن كيف؟ وما معنى هذا السطر الغريب؟ فما نعرفه أننا نستخدم الفاصلة الأحادية ' فقط عندما نودّ التعبير عن محرف وحيد، لكننا هنا كتبنا أربعة محارف دفعة واحدة! فما القصة؟
عندما انضممتُ إلى فريق EA كان مشروعي الأول هو لعبة الهوكي NHL2007، وقد تركز عملي آنذاك في مجال الرسوميات، وقد واجهتُ أسطراً مماثلة للسطر الغريب أعلاه في خضمّ كود اللعبة الشاسع، وتحديداً في القسم المسؤول عن قراءة ملفات الشخصيات في اللعبة، في تركيبة تشبه المثال التالي:
int recordID = GetNextRecordIDFromFile(characterFile); // Read from file
switch (recordID)
{
case 'head':
ReadHead(characterFile);
break;
case 'indx':
ReadIndex(characterFile);
break;
case 'data':
ReadData(characterFile);
break;
}
أصبتُ بالدهشة من مرأى الكود، وطفقتُ أسأل زملائي المبرمجين عن صلاحيته. وقد أصيبوا هم أيضاً بالدهشة عندما رأوه، ولم يستطع أي منهم فهمه... باستثناء شخص واحد: سيرجي سافشنكو، والذي يشغل حالياً منصب التوجيه التقني للاستديو (CTO). وقد كان الجواب كالآتي:
هذه التركيبة تعني متغير عددي بسعة أربعة بايتات، حيث كل بايت يحمل قيمة محرف من المحارف الأربعة المكتوبة في جدول آسكي. أي أن 'head' هي طريقة أخرى للتعبير عن الرقم 1751474532. أما 'indx' فهي تقابل الرقم 1768842360 وهكذا.
يمكننا استخدام هذه التركيبة لترميز البيانات لكن بطريقة مقروءة. ففي المثال أعلاه، ملف المجسم يحتوي عدة أقسام، كالترويسة والفهرس والبيانات الأخرى. ونرمز لكل قسم بأربعة بايتات تخبرنا بنوعه. قيمة هذه البايتات تساوي إما 'head' أو 'indx' أو 'data' طبقاً لنوعية القسم.
آمل أن تستفيدوا من هذه الحيلة في برامجكم وملفاتكم الخاصة.
في النهاية أستعير المثل الشامي القائل: عشنا وشفنا
والسلام عليكم ورحمة الله