الدرس 8 من 8
المجاميع الاختبارية
- 15 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
رقم يكشف عطب البايتات
الشرح
حين تقرأ صيغة ملف تجد كثيرًا رقمًا محسوبًا من بايتات البيانات نفسها، وظيفته أن يكشف العطب: إن تغيّر بايت واحد في الطريق لم يعد الرقم يطابق. هذا الرقم اسمه المجموع الاختباري (checksum).
أبسطه أن تجمع البايتات وتأخذ الباقي على 256 فيبقى في بايت واحد، أي sum(data) & 0xFF. لكنه ضعيف، فلو تبادل بايتان مكانيهما بقي المجموع كما هو.
لذلك تستعمل الصيغ الحقيقية CRC32، وهو رقم من 32 بتًا يتغيّر مع أي عطب صغير تقريبًا، حتى تبديل بايتين. ففي PNG مثلًا تنتهي كل قطعة (chunk) بأربعة بايتات هي CRC32 لنوع القطعة وبياناتها، وفي ZIP لكل ملف CRC32 خاصّ به. وفي Python تحسبه الدالة zlib.crc32:
import zlib a, b = b"ab", b"ba" sum(a) == sum(b) # True zlib.crc32(a) == zlib.crc32(b) # False
وفي التحليل تحتاجه في اتجاهين: لتتأكّد أن الملف الذي تقرؤه سليم، ولتعيد حسابه حين تعدّل ملفًا لك، لأن البرنامج الذي يقرأ الصيغة يرفض قطعة لا يطابقها مجموعها.
المطلوب
اكتب الدالة checksum8(data) التي تُرجع مجموع البايتات بالباقي 256، والدالة verify(data, expected) التي تُرجع True إذا كان CRC32 للبيانات يساوي expected وإلا False، واحسبه بالدالة zlib.crc32.
الفحوص
5 فحوص- المجموع البايتيّ يلتفّ بالباقي 256
- المجموع على كتل أخرى
- التحقّق يقبل البيانات السليمة
- التحقّق يرفض البيانات المعطوبة
- محسوب بالدالة zlib.crc32