تقنية

iter_unpack في بايثون: هل يتجاهل البايت الزائد؟

خمسة بايتات مع >H ترفع struct.error في المثال.
بايت زائد يرفضه المكرر.

iter_unpack يشترط طولًا مضاعفًا لحجم السجل؛ كل خطوة تعيد صفًا (tuple). [1]

الخلاصة السريعة

لا؛ لا يتجاهل بايتًا زائدًا في مثالنا. [1]

  • iter_unpack يشترط طولًا مضاعفًا لحجم السجل؛ كل خطوة تعيد صفًا (tuple). [1]
  • السجل >H ببايتين، عدد غير موقّع، والبايت الأعلى أولًا. [1]
  • على CPython 3.12.14، bad أدناه طوله 5 بايتات. [1]
  • إنشاء المكرر يطلق struct.error؛ لا يتجاهل الذيل في المثال. [1]
  • تحكم: حذف ff يعطي 7 و9؛ إضافة 00 تضيف 65280؛ يطابق حساب البايتات القراءات، ويبقى bad. [1]

شرط الدفعة

iter_unpack يشترط طولًا مضاعفًا لحجم السجل؛ كل خطوة تعيد صفًا (tuple). [1]

حجم السجل

السجل >H ببايتين، عدد غير موقّع، والبايت الأعلى أولًا. [1]

خمسة بايتات

على CPython 3.12.14، bad أدناه طوله 5 بايتات. [1]

import struct bad=bytes.fromhex("00 07 00 09 ff") try: struct.iter_unpack(">H",bad) except struct.error: print("struct.error") [1]

أربعة بايتات كاملة تعطي قيمتي 7 و9.
بايتات كاملة تقرأ سجلين.

الخطأ والتحكم

إنشاء المكرر يطلق struct.error؛ لا يتجاهل الذيل في المثال. [1]

good=bad[:-1] print(list(struct.iter_unpack(">H",good))) padded=bad+bytes([0]) print(list(struct.iter_unpack(">H",padded))) [1]

تحكم: حذف ff يعطي 7 و9؛ إضافة 00 تضيف 65280؛ يطابق حساب البايتات القراءات، ويبقى bad. [1]

المراجع

  1. Python struct

للتوسع: لغات البرمجة.

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