الدرس 3 من 9

ترتيب البايتات

هدف الدرس

العدد نفسه بترتيبين في الذاكرة

01

الشرح

البايت الواحد لا يكفي لكل الأعداد، فالعدد 0x12345678 يحتاج أربعة بايتات. وهنا سؤال مهمّ: بأيّ ترتيب تُخزَّن هذه البايتات في الذاكرة؟ هذا ما يسمّى ترتيب البايتات (endianness)، وله طريقتان:

(0x12345678).to_bytes(4, "big")      12 34 56 78
(0x12345678).to_bytes(4, "little")   78 56 34 12

كبير الطرف (big-endian) يضع البايت الأعلى قيمة أوّلًا كما نكتب الأعداد، وصغير الطرف (little-endian) يضع البايت الأدنى أوّلًا. ومعالجات x86 وأغلب معالجات ARM تعمل بصغير الطرف، فإذا قرأت عددًا بالترتيب الخطأ خرج لك رقم لا معنى له. فالبايتات 01 00 00 00 تساوي 1 بصغير الطرف، و16777216 بكبير الطرف.

وفي Python تقرأ العدد بالدالة int.from_bytes(b, "little") أو int.from_bytes(b, "big")، وتكتبه بالطريقة n.to_bytes(4, "little").

02

المطلوب

اكتب الدالة read_u32(data, little=True) لتقرأ أوّل أربعة بايتات من data عددًا بلا إشارة، بصغير الطرف، فإن كان little يساوي False فبكبير الطرف. ثم اكتب الدالة both(data) لتُرجع صفًّا فيه القراءتان معًا، بصغير الطرف أوّلًا ثم بكبير الطرف.

الفحوص

5 فحوص
  1. الدالة read_u32 تقرأ بصغير الطرف
  2. الدالة read_u32 تقرأ بكبير الطرف حين يُطلب
  3. الدالة read_u32 تقرأ أوّل أربعة بايتات من أيّ بيانات
  4. الدالة both تُرجع الاتجاهين بالترتيب
  5. القراءة تقرأ أربعة بايتات فقط ولو طالت البيانات
03

تلميحات

0/3
main.py
المخرجاتPython (Pyodide)

نحمّل بيئة Python الآن. يحدث هذا مرّة واحدة فقط، ثم يحفظها متصفّحك.

–/5

يبدأ الفحص حين تجهز البيئة.

تجد 5 فحوص في بطاقة «المطلوب».