Python תכנת module מסוגלת לבצע את ההמרות בין ערכי Python ו-C structs, שמיוצגים כ-מחרוזות Python.
Python Struct
- ניתן להשתמש במודול struct של Python להתמודד עם נתונים בינאריים המאוחסנים בקבצים, במסדי נתונים או מחיבורי רשת וכדומה.
- הוא משתמש במחרוזות פורמט כתיאורים קומפקטיים של התפרסות ה-C structs וההמרה הנדרשת ל/מתוך ערכי 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()
פונקציה זו מארזת רשימת ערכים לייצוג מחרוזת של הסוג המסוים. הארגומנטים חייבים להתאים לערכים הנדרשים על פי התבנית בדיוק. בואו נסתכל מהר על דוגמת struct 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()
פונקציה זו מחשבת ומחזירה את גודל ייצוג המחרוזת של struct עם פורמט נתון. הגודל מחושב ביחידות של בתים. בואו נסתכל מהר על קטע קוד מדוגמה:
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
# מיובא כדי ליצור מאגר מחרוזת
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