Lesson illustration

التحويل بين الأنظمة العددية في تحليل البرامج

مرحبًا مجددًا. في الدرس السابق استخدمت PowerShell لرؤية الملفات والعمليات والخدمات، ولاحظت أن بعض القيم تظهر بصورة مألوفة مثل حجم ملف أو PID. قريبًا، حين تبدأ فحص الذاكرة والتفريغات الثنائية وتعليمات Assembly، ستجد القيم نفسها معروضة غالبًا بصيغة مختلفة: ثنائية أو سداسية عشرية.

هدف هذا الدرس هو أن تتعامل مع هذه الصيغ بوصفها تمثيلات مختلفة للقيمة نفسها، لا بوصفها أرقامًا غامضة جديدة. ستتمكن من تحويل القيم بين العشري والثنائي والسداسي عشري يدويًا، ثم التحقق من حساباتك بأدوات آمنة داخل مختبر Windows.

المسار المقترح يستغرق نحو 40–45 دقيقة: فهم الفكرة، ثم قراءة قصيرة، ثم تطبيق يدوي وعملي.


القيمة واحدة، لكن طريقة كتابتها تتغير

النظام العددي له أساس: عدد الرموز المتاحة فيه، وقيمة كل منزلة فيه.

النظامالأساسالرموز المسموحةمثال شائع في التحليل
العشري10من 0 إلى 9أحجام الملفات، أرقام العمليات، الوقت
الثنائي20 و1البتات والأعلام وتمثيل البيانات داخل العتاد
السداسي عشري16من 0 إلى 9 وA إلى Fالذاكرة، البايتات، الثوابت، تفريغات الملفات

هذه القيم الثلاث متساوية عدديًا:

20310=110010112=0xCB203_{10} = 11001011_2 = 0xCB

لكن كل صيغة تبرز شيئًا مختلفًا:

  • العشري مناسب غالبًا للقراءة البشرية اليومية.
  • الثنائي يوضح كل بت على حدة.
  • السداسي عشري يجعل البيانات الثنائية الطويلة أقصر وأسهل في التقسيم إلى بايتات.

البادئة 0x تعني أن ما بعدها مكتوب بالسداسي عشري، مثل 0xCB. أما البادئة 0b فتدل عادة على الثنائي، مثل 0b11001011. البادئة نفسها ليست جزءًا من القيمة المخزنة في الذاكرة؛ إنها إشارة للقارئ أو للأداة إلى طريقة قراءة الرموز.

انتبه خصوصًا إلى هذا الفرق:

1010=10102=0xA10_{10} = 1010_2 = 0xA

لكن:

0x10=16100x10 = 16_{10}

إذًا لا يجوز افتراض أن 10 و0x10 لهما القيمة نفسها.


الفكرة المشتركة: وزن كل منزلة

أنت تستخدم النظام العشري يوميًا دون تفكير. العدد 36510365_{10} يعني:

3×102+6×101+5×1003 \times 10^2 + 6 \times 10^1 + 5 \times 10^0

أي ثلاث مئات، وست عشرات، وخمس آحاد.

النظام الثنائي يعمل بالطريقة نفسها، لكن أوزان الخانات هي قوى العدد 22:

موضع البت من اليمينالوزن
020=12^0 = 1
121=22^1 = 2
222=42^2 = 4
323=82^3 = 8
424=162^4 = 16
525=322^5 = 32
626=642^6 = 64
727=1282^7 = 128

لتحويل القيمة الثنائية 11001011 إلى عشري، اجمع أوزان الخانات التي تحتوي على 1:

110010112=128+64+8+2+111001011_2 = 128 + 64 + 8 + 2 + 1 110010112=2031011001011_2 = 203_{10}

لا تضف أوزان الخانات التي تحتوي على 0.

اقرأ المادة العربية التالية لتثبيت هذه الفكرة، ثم شاهد كيف تُستخدم القسمة المتكررة لعكس العملية. لا تحتاج إلى قراءة بقية المقالة الآن؛ ركز فقط على الأقسام المحددة.

{"type":"reading","par_intro":"اقرأ من مقال أكاديمية حسوب لأنه يشرح المنزلة الثنائية والسداسية العشرية بالعربية، مع أمثلة حسابية مفيدة للتحليل منخفض المستوى.","par_directions":"ابدأ بقسم **«نظرية النظام الثنائي»**: ركز على جدول قوى العدد 2 وعلى المثال الذي يفكك العدد العشري 203 إلى بتات. بعده انتقل إلى القسم الفرعي **«التحويل»** واقرأ <span data-type=\"resource_reading_textrange\" data-resource-subitem-id=\"d9740609\" data-range-start=\"203\" data-range-end=\"11001011\">مثال القسمة المتكررة</span> من جدول عمليات القسمة حتى النتيجة؛ الفكرة الأساسية هي تسجيل البواقي ثم قراءتها بالعكس.\n\nثم انتقل إلى قسم **«النظام الست عشري Hexadecimal»**. اقرأ شرح الحروف والقيم وجدول المطابقة بين الثنائي والسداسي والعشري، ثم اتبع <span data-type=\"resource_reading_textrange\" data-resource-subitem-id=\"0eb2e838\" data-range-start=\"A B C D E F\" data-range-end=\"0xAB12\">مثال تحويل ست عشري</span> الذي يشرح لماذا يمثل كل رقم سداسي أربع بتات وكيف تُكوَّن القيم الأطول.","learning_duration":"12 minutes","url":"https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%B9%D8%AF-%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A-binary-%D8%A3%D8%B3%D8%A7%D8%B3-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-r1658","title":"تعرف على نظام العد الثنائي Binary أساس الحوسبة - الأنظمة والأنظمة المدمجة - أكاديمية حسوب","isV2":true,"blockId":"5a9f5267-bb6c-4e68-9772-432fc4854441","lessonId":"ea582b98-1c1c-4b4c-88b7-14cb95393aa0"}




من عشري إلى ثنائي: طريقتان مفيدتان

الطريقة الأولى: اختيار قوى العدد 2

لنحوّل 451045_{10} إلى ثنائي. نبحث عن أكبر قوة للعدد 2 لا تتجاوز 45:

  • 3232 تدخل في 45، إذًا بت 3232 يساوي 1.
  • يبقى 4532=1345 - 32 = 13.
  • 1616 لا تدخل في 13، إذًا بت 1616 يساوي 0.
  • 88 تدخل، فيبقى 55.
  • 44 تدخل، فيبقى 11.
  • 22 لا تدخل.
  • 11 تدخل.

لذلك:

4510=101101245_{10} = 101101_2

عند التعامل مع بايت كامل، نكتب أصفارًا في اليسار حتى يصبح الطول 8 بتات:

4510=00101101245_{10} = 00101101_2

هذه الأصفار اليسرى لا تغير القيمة العددية، لكنها توضح أن التمثيل المقصود عرضه ضمن بايت واحد.

الطريقة الثانية: القسمة المتكررة على 2

هذه الطريقة تعمل لأي عدد عشري. اقسم العدد على 2، وسجل الباقي في كل مرة:

العمليةخارج القسمةالباقي
45÷245 \div 2221
22÷222 \div 2110
11÷211 \div 251
5÷25 \div 221
2÷22 \div 210
1÷21 \div 201

بعد أن يصل خارج القسمة إلى صفر، اقرأ البواقي من الصف الأخير إلى الصف الأول:

4510=101101245_{10} = 101101_2

استخدم طريقة قوى العدد 2 عندما تريد قراءة قيمة ثنائية قصيرة بسرعة في مصحح الأخطاء. واستخدم القسمة المتكررة عندما تحتاج إلى تحويل قيمة عشرية يدويًا بطريقة مضمونة.

{
  "type": "exercise",
  "id": "229b99c8-3786-46ac-bee4-c510132d4b9b"
}

لماذا السداسي عشري هو اللغة اليومية للمحلل؟

كتابة بايت واحد بالثنائي تحتاج إلى 8 رموز مثل 11001011. لكن السداسي عشري يختصره إلى رمزين فقط: CB.

السبب الرياضي بسيط:

16=2416 = 2^4

أي أن كل رقم سداسي عشري يمثل بالضبط أربع بتات. تسمى مجموعة الأربع بتات أحيانًا نصف بايت أو Nibble.

سداسي عشريثنائيعشري
000000
100011
701117
810008
910019
A101010
B101111
C110012
D110113
E111014
F111115

لذلك:

0xCB=1100 101120xCB = 1100\ 1011_2

نقسم CB إلى رقمين:

  • C تقابل 1100
  • B تقابل 1011

ثم نضع المجموعتين بجوار بعضهما:

0xCB=1100101120xCB = 11001011_2

وبما أن:

110010112=2031011001011_2 = 203_{10}

إذن:

0xCB=203100xCB = 203_{10}

هذه العلاقة تجعل السداسي عشري مناسبًا جدًا لمحررات Hex، ونافذة الذاكرة في x64dbg، والثوابت التي ستراها في Ghidra.

{"type":"image","url":"https://learningnetwork.cisco.com/servlet/rtaImage?eid=ka03i000000f5xZ&feoid=00N3i00000D6DDX&refid=0EM3i000000DgmT","caption":"يعرض الجدول الأيسر المطابقة بين الأرقام العشرية والثنائية والسداسية من 0 إلى 15، ويعرض الجدول الأيمن أوزان بتات الأوكتت: 128 و64 و32 و16 و8 و4 و2 و1. استخدم الجدولين لقراءة قيمة بايت من الثنائي أو السداسي بسرعة.","isV2":true,"blockId":"6e9dcdb4-db21-40b4-9c1f-f8b5dccada05","lessonId":"ea582b98-1c1c-4b4c-88b7-14cb95393aa0"}



قاعدة عملية لا بد من تثبيتها

  • كل رقم سداسي عشري يمثل 4 بتات.
  • كل رقمين سداسيين يمثلان بايتًا واحدًا، أي 8 بتات.
  • البايت الواحد يملك 256 احتمالًا مختلفًا:
28=2562^8 = 256

لذلك يمتد نطاق قيمة البايت غير الموقّع من:

010 إلى 255100_{10} \text{ إلى } 255_{10}

وبالسداسي عشري:

00 إلى FF

مثلًا:

0xFF=15×16+15=255100xFF = 15 \times 16 + 15 = 255_{10}

سنناقش لاحقًا الفرق بين تفسير البايت بوصفه قيمة موقعة أو غير موقعة. في هذا الدرس، ركز على أن البايت هو ثمانية بتات، وأن FF هو أعلى نمط ممكن لبايت واحد.


من سداسي عشري إلى عشري

أوزان الخانات السداسية هي قوى العدد 16:

موضع الخانة من اليمينالوزن
0160=116^0 = 1
1161=1616^1 = 16
2162=25616^2 = 256
3163=409616^3 = 4096

لتحويل 0x3F8 إلى عشري:

0x3F8=3×162+F×161+8×1600x3F8 = 3 \times 16^2 + F \times 16^1 + 8 \times 16^0

تذكر أن F تساوي 15:

0x3F8=3×256+15×16+80x3F8 = 3 \times 256 + 15 \times 16 + 8 0x3F8=768+240+80x3F8 = 768 + 240 + 8 0x3F8=1016100x3F8 = 1016_{10}

لا يلزم أن تحفظ قوى 16 الكبيرة كلها الآن. احفظ أول ثلاث قيم فقط: 11، و1616، و256256. ستكفيك هذه القيم لتفكيك كثير من الثوابت الصغيرة والبايتات والكلمات التي تقابلها في المراحل الأولى من التحليل.

{
  "type": "exercise",
  "id": "afc962fa-8800-419c-ab6b-c2496aec1eb2"
}

من عشري إلى سداسي عشري

يمكنك استخدام القسمة المتكررة نفسها، لكن على 16 بدل 2.

لتحويل 20310203_{10} إلى سداسي عشري:

العمليةخارج القسمةالباقي
203÷16203 \div 161211
12÷1612 \div 16012

حوّل البواقي التي تتجاوز 9:

  • 11 تكتب B
  • 12 تكتب C

ثم اقرأ البواقي من الأسفل إلى الأعلى:

CB

إذن:

20310=0xCB203_{10} = 0xCB

هذه الطريقة صحيحة دائمًا، لكن مع الوقت ستبدأ في تمييز القيم الشائعة مباشرة. مثلًا، من المفيد أن تصبح مألوفة لديك هذه التحويلات:

عشريسداسي عشريثنائي ضمن بايت
00000000000
10100000001
100A00001010
161000010000
322000100000
644001000000
1288010000000
255FF11111111

مختبر عملي: التحويل يدويًا ثم التحقق في Windows

خصص نحو 15–20 دقيقة لهذا المختبر داخل آلة Windows الافتراضية. لا تحتاج إلى عينة أو برنامج غير موثوق؛ الهدف بناء سرعة قراءة القيم فقط.

1. أنشئ ورقة ملاحظات للتحويل

افتح ملفًا نصيًا داخل مجلد المختبر، وسجل فيه الجدول التالي. احسب القيم أولًا يدويًا، ثم تحقق منها لاحقًا:

عشريثنائي ضمن 8 بتاتسداسي عشري
13
42
64
127
128
200
255

أثناء الحل، اكتب أوزان البتات فوق القيمة الثنائية:

128 64 32 16 8 4 2 1

هذه الطريقة تمنع خطأ شائعًا: قراءة البتات من اليسار وكأن وزنها يبدأ بـ1. البت الأيمن دائمًا وزنه 1 في القراءة العددية المعتادة.

2. تحقق من نتائجك بـ PowerShell

بعد الحساب اليدوي، افتح PowerShell ونفذ الأوامر التالية:

[Convert]::ToString(203, 2)

يعرض هذا التمثيل الثنائي للقيمة العشرية 203.

"{0:X}" -f 203

يعرض هذا القيمة نفسها بالسداسي العشري، والمتوقع أن ترى:

CB

وللتحويل من نص سداسي عشري إلى عشري:

[Convert]::ToInt32("CB", 16)

المتوقع:

203

استخدم هذه الأوامر للتحقق، لا بدلًا من الحساب. في التحليل العكسي، قد تحتاج إلى تقييم قيمة قصيرة بسرعة وأنت متوقف عند نقطة توقف؛ لا يكون من العملي فتح محول في كل مرة.

3. استخدم محول الأنظمة بوصفه مدققًا مستقلًا

المورد التالي يحتوي على محول تفاعلي وخلاصة لطريقتي التحويل. استخدمه بعد إكمال جدولك اليدوي: أدخل قيمة عشرية مثل 200، ثم راقب صيغتها الثنائية والسداسية. بعد ذلك أدخل قيمة مثل 0xCB وتأكد من ظهور 203.

{"type":"reading","par_intro":"استخدم هذا المورد كأداة تحقق سريعة، لا كبديل عن فهم قيمة المنزلة أو طريقة القسمة المتكررة.","par_directions":"في أعلى الصفحة، استخدم حقل **«القيمة»** وأدخل أعدادًا عشرية أو قيمًا مسبوقة بـ`0x` أو `0b`. لاحظ المخرجات في حقول الثنائي والعشري والسداسي. بعد التجربة، انتقل إلى قسم **«أسئلة شائعة»** واقرأ <span data-type=\"resource_reading_textrange\" data-resource-subitem-id=\"1d1bc0d9\" data-range-start=\"1A3\" data-range-end=\"419\">مثال أساس إلى عشري</span>، الذي يوضح ضرب كل خانة في قوة الأساس المناسبة، ثم راجع الفقرة التالية التي تشرح القسمة المتكررة عند التحويل من العشري.","learning_duration":"4 minutes","url":"https://ar.buildingclub.info/number-base-converter","title":"محوّل الأنظمة العددية: ثنائي وسداسي عشري وثُماني","isV2":true,"blockId":"8f870016-a559-425c-9d79-e980c8586195","lessonId":"ea582b98-1c1c-4b4c-88b7-14cb95393aa0"}



4. وثّق النتيجة بصيغة محلل

أضف إلى ملاحظاتك هذا المثال:

القيمة: 203 decimal
الثنائي ضمن بايت: 11001011
السداسي العشري: 0xCB
التحقق: PowerShell Convert.ToString و ToInt32

اكتب دائمًا الأساس أو البادئة عندما يكون هناك احتمال للغموض. عبارة مثل “القيمة هي 10” ناقصة في ملاحظات التحليل إذا لم يعرف القارئ هل تقصد عشريًا أم سداسيًا.


أخطاء شائعة ينبغي تجنبها

اعتبار A حرفًا لا رقمًا.
في السداسي العشري، A تعني 10، وF تعني 15. لذلك 0x1A ليس “واحدًا ثم حرف A”، بل:

0x1A=1×16+10=26100x1A = 1 \times 16 + 10 = 26_{10}

نسيان الأصفار اليسرى عند الحديث عن حجم ثابت.
القيمتان 0xA و0x0A لهما القيمة العددية نفسها، لكن 0x0A يوضح أنها ممثلة ضمن بايت من رقمين سداسيين.

تقسيم الثنائي إلى مجموعات خاطئة عند تحويله إلى Hex.
ابدأ دائمًا من اليمين، واجمع البتات في كتل من أربعة. إذا بقيت مجموعة ناقصة في اليسار، أضف أصفارًا يسارها.

مثال:

101101

يصبح:

0010 1101

ثم:

2D

لذلك:

1011012=0x2D=4510101101_2 = 0x2D = 45_{10}

الخلط بين قيمة البايت وطريقة عرضه.
القيمة 255 و0xFF و11111111 تصف النمط العددي نفسه. الذي يتغير هو طريقة الكتابة والسياق الذي يجعل إحدى الطرق أوضح من الأخرى.

{
  "type": "exercise",
  "id": "47c22cbc-940f-44d9-8998-4efa9842aa85"
}

الخلاصة

أصبحت الآن قادرًا على قراءة والتحويل بين ثلاثة تمثيلات أساسية ستظهر باستمرار في الهندسة العكسية:

  • الثنائي أساسه 2، وتحدد كل خانة فيه بتًا بقيمة 0 أو 1.
  • العشري أساسه 10، وهو مناسب للعرض المعتاد لقيم مثل PID والحجم.
  • السداسي العشري أساسه 16، ويستخدم الرموز A إلى F للقيم من 10 إلى 15.
  • كل رقم سداسي عشري يمثل 4 بتات، وكل رقمين سداسيين يمثلان بايتًا من 8 بتات.
  • يمكنك التحويل إلى العشري بجمع أوزان الخانات، والتحويل من العشري بالقسمة المتكررة على الأساس المطلوب.
  • البادئات مثل 0x و0b تمنع الالتباس عند توثيق القيم.

في الدرس التالي ستبني على هذا الأساس لتفسير الأعداد الصحيحة الموقعة وغير الموقعة داخل الذاكرة: كيف يمكن لنمط البتات نفسه أن يقرأ كقيمة موجبة كبيرة أو قيمة سالبة، بحسب نوع البيانات وطوله.

Can't find a good explanation? Sign up and we'll make it for you