السلام عليكم,, خطرت لي فكرة برنامج بسيط كتطبيق لدروس أحاول إكمالها حالياً. الدروس هي كتاب Charles Petzold الشهير في برمجة Windows و شرح فلسفتها بطريقة جميلة جداً و مفصلة كثيراً, بالطبع هدفه هو شرح المفاهيم بدلاً من شرح الدوال أو شرح مكتبات Windows بشكل أصح. أعرف أنني لم أشارك منذ مدة, و لكن ذلك يرجع لعدة ظروف, و لكن سنعود معكم من جديد بإذن الله. سأقوم بوضع كتاب برمجة Windows في المكتبة لمن يريد الاستفادة منه. و لكن لابد من القول بإن برمجة Windows هي علم بحد ذاته و لم أكن أعتقد أني سأستمتع بتعلم شيء جديد كهذا الشيء. البرنامج عبارة عن محرر HEX للملفات, و بالطبع ستكون الواجهة بسيطة لأنه مشروع أفكر بتطبيقه بعد الانتهاء من قراءة عدد معين من فصول الكتاب, و لكن تركيزي في هذه المرحلة سيكون على محرك البرنامج نفسه. حتى أقوم ببناء الواجهة لاحقاً بعد كتابة و اختبار محرك البرنامج. كشرح بسيط لماذا نحتاج إلى محرر يعرض لنا مكونات أي ملف لدينا, على شكل أرقام بالنظام الـ Hexadecimal, في الحقيقة لم أجد لاسم النظام في رأسي لذلك كتبت المصطلح باللغة الانجليزية. الميزة أن كل رقم في النظام الـ Hexadecimal يمثل عدد محدد من الـ Bits, بشكل أكثر تحديداً نصف byte أو ما يطلق عليه nibble, و بالتالي فإننا يمكننا أن نغير أي ثابت يحتفظ به البرنامج دون التأثير على بنية البرنامج نفسه أو حجمه. و هذا من الأشياء التي لا يمكن القيام بها في النظام العشري على حد علمي. لأن كل عدد عشري يحتاج إلى عدد غير صحيح لتمثليه على عكس النظام الـ Hexadecimal أو الثماني Octal, في الحقيقة أن النظام الثماني يوفر هذه الخاصية أيضاً و لكن المبرمجين اعتادوا على النظام الـ Hexadecimal أكثر, لأن كل byte يمكن تمثيله برقمين, بدلاً من تمثيله بثلاثة أرقم كما في النظام الثماني. ما هي مهمة محرك البرنامج إذاً ؟ مهمة محركنا هو تحويل مصفوفة عددية إلى نص, و هذا النص هو الأعداد نفسها و لكن بالنظام الـ Hexadecimal, الأعداد في الحاسوب تمثل بالنظام الثنائي, و كل ما تراه على الشاشة هي نصوص و ليست أعداد. صحيح أن الحاسوب على مستوى المعالج يتعامل مع البيانات على شكل أعداد ثنائية, و لكن جميع ما يتم إخراجه للشاشة عبارة عن مجموعة من الحروف, فعلى سبيل المثال لو أن لدينا المثال التالي في ++C :
int x = 15;cout << x;
void convertToHex( unsigned char numbers[], char hexa[], unsigned int numbersCount );
int nums[2] = { 15, 255 };char hexa[17];convertToHex( reinterpret_cast<unsigned char*>(nums), hexa, 17 );std::cout << hexa;