هيكل Python pack، unpack

وحدة struct في لغة Python قادرة على تنفيذ التحويلات بين قيم Python وهياكل C، التي تمثل بواسطة سلاسل Python.

وحدة struct في Python

  • يمكن استخدام وحدة struct في التعامل مع البيانات الثنائية المخزنة في الملفات وقواعد البيانات أو من اتصالات الشبكة وما إلى ذلك.
  • إنها تستخدم سلاسل التنسيق كوصف مضغوط لتخطيط الهياكل C والتحويل المقصود إلى/من قيم Python.

وظائف وحدة struct في Python

هناك خمس وظائف مهمة في وحدة struct – pack()، unpack()، calcsize()، pack_into() و unpack_from(). في جميع هذه الوظائف، يجب أن نقدم تنسيق البيانات التي ستتم تحويلها إلى ثنائي. بعض أحرف التنسيق الشائعة هي:

?: boolean
h: short
l: long
i: int
f: float
q: long long int

يمكنك الحصول على قائمة كاملة لأحرف التنسيق هنا. دعنا نبدأ في استكشاف وظائف وحدة struct تباعًا.

Python struct.pack()

تقوم هذه الوظيفة بتعبئة قائمة من القيم في تمثيل سلسلة للنوع المحدد. يجب أن تتطابق الوسائط مع القيم المطلوبة من قبل التنسيق بدقة. دعونا نلقي نظرة سريعة على مثال pack() التالي:

import struct

var = struct.pack('hhl', 5, 10, 15)
print(var)
 
var = struct.pack('iii', 10, 20, 30)
print(var)

عند تشغيل هذا النص البرمجي، نحصل على التمثيل التالي: يرجى ملاحظة أن ‘b’ في الإخراج يشير إلى الثنائي.

Python struct.unpack()

تقوم هذه الوظيفة بفك قيمة المعبأة إلى تمثيلها الأصلي مع التنسيق المحدد. تقوم هذه الوظيفة دائمًا بإرجاع tuple ، حتى إذا كان هناك عنصر واحد فقط. دعونا نلقي نظرة سريعة على مثال وظيفة unpack() الخاصة بـ struct:

import struct
var = struct.pack('hhl', 5, 10, 15)
print(var)
print(struct.unpack('hhl', var))

عند تشغيل هذا النص البرمجي، نحصل على التمثيل الأصلي لدينا مرة أخرى: من الواضح أنه يجب علينا إخبار مترجم Python الشكل الذي نحتاج إلى فك قيمه إليه.

حساب حجم هيكل Python struct calcsize()

هذه الوظيفة تقوم بحساب وإرجاع حجم التمثيل النصي للهيكل بتنسيق معين. يتم حساب الحجم بالبايت. دعنا نلقي نظرة سريعة على مقطع الشفرة المثالي التالي:

import struct
 
var = struct.pack('hhl', 5, 10, 15)
print(var)
print("Size of String representation is {}.".format(struct.calcsize('hhl')))

عند تشغيل هذا النص، نحصل على التمثيل التالي:

Python struct pack_into()، unpack_from()

تسمح لنا هذه الوظائف بتعبئة القيم في مخزن النصوص وفك تعبئتها من مخزن النصوص. تم تقديم هذه الوظائف في الإصدار 2.5.

import struct
# يتم استيراد ctypes لإنشاء مخزن نصي
import ctypes

# كما هو موضح في المثال السابق
size = struct.calcsize('hhl')
print(size)

# يتم إنشاء مخزن 'buff' من ctypes
buff = ctypes.create_string_buffer(siz)

# struct.pack_into() يقوم بتعبئة البيانات في buff ولا يُرجع أي قيمة
# struct.unpack_from() يقوم بفك تعبئة البيانات من buff، ويُرجع tuple من القيم
print(struct.pack_into('hhl', buff, 0, 5, 10, 15))
print(struct.unpack_from('hhl', buff, 0))

عند تشغيل هذا النص، نحصل على العرض التالي: هذا كل شيء لمقدمة قصيرة حول وحدة struct في بايثون.

Source:
https://www.digitalocean.com/community/tutorials/python-struct-pack-unpack