تقنية

فك بايتات بايثون: الإزاحة ليست رقم السجل

أربعة مواضع بايت
البافر بالنظام الست عشري. [1] [2]

الحجم والإزاحة مهمان. [1] [2]

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

unpack يحتاج الحجم المطابق؛ unpack_from يحتاج بايتات كافية بدءًا من الإزاحة. [1] [2]

  • >H عدد صحيح غير موقّع، ببايتين؛ البايت الأعلى أولًا. [1] [2]
  • البافر 00 07 00 0a أربعة بايتات؛ unpack(">H",b) يرفع struct.error. [1] [2]
  • unpack_from عند 0 يعطي (7,)؛ وعند 2 يعطي (10,). [1] [2]
  • الإزاحة بالبايت: عند 1 نحصل على (1792,)، وليس السجل التالي. [1] [2]
  • عند 3 يبقى بايت واحد؛ struct.error. جربنا 3.12.14 وإزاحات غير سالبة. [1] [2]

المثال

import struct
b=bytes.fromhex("00 07 00 0a")
for offset in (0,1,2):
    print(offset,struct.unpack_from(">H",b,offset))

[1] [2]

الناتج: 0 (7,)؛ 1 (1792,)؛ 2 (10,). [1] [2]

الحجم

calcsize(">H")=2؛ أربعة بايتات تفشل مع unpack. القراءة الجزئية تختار موضعًا يترك بايتين على الأقل. [1] [2]

الإزاحة

الإزاحة بالبايت من الصفر. عند 1 نقرأ 07 00؛ 7*256=1792. السجل التالي هنا يبدأ عند 2، لا 1. [1] [2]

موضع 1 يختلف عن 2
صيغة >H؛ عند 3 خطأ. [1] [2]

النطاق

عند 3 يبقى 0a وحده؛ يفشل unpack_from. بافر ثابت وصيغة معلنة؛ لم نفك بروتوكولًا مجهولًا. [1] [2]

المراجع

  1. Python: struct
  2. CPython 3.12.14: فحص البافر
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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