جدول المحتويات
11.3. العمل مع تخطيطات سجلات البيانات الثنائية #
توفر وحدة struct دالتي pack() وunpack() للعمل مع تنسيقات السجلات الثنائية متغيرة الطول. يوضح المثال التالي كيفية تكرار معلومات الرأس في ملف ZIP دون استخدام وحدة zipfile. رمزا الحزمة “H” و”I” يمثلان أرقامًا غير موقعة ثنائية البايت وأربعة بايتات على التوالي. يشير الرمز “<” إلى أنهما بحجم قياسي وبترتيب بايتات صغير:
import struct
with open('myfile.zip', 'rb') as f:
data = f.read()
start = 0
for i in range(3): # show the first 3 file headers
start += 14
fields = struct.unpack('<IIIHH', data[start:start+16])
crc32, comp_size, uncomp_size, filenamesize, extra_size = fields
start += 16
filename = data[start:start+filenamesize]
start += filenamesize
extra = data[start:start+extra_size]
print(filename, hex(crc32), comp_size, uncomp_size)
start += extra_size + comp_size # skip to the next header