struct modul Pythonban

A struct modul be Piton lehetővé teszi a bináris adatokkal való munkát a Python-értékek és a C-stílusú bináris adatok közötti konvertálás biztosításával. Ez különösen akkor hasznos, ha bináris fájlformátumokkal vagy hálózati protokollokkal foglalkozik. Főbb jellemzői a következők:

  • Csomagolás konvertálja a Python értékeket bináris adatokká (byte).
  • Kicsomagolás bináris adatok visszaalakítása Python értékekké.
  • Karakterláncok formázása formátumkódok segítségével határozza meg az adatok be- és kicsomagolását (pl. i az f egész számokhoz a lebegésekhez).

A struct.pack() metódusai

1.Struct.pack(): A Python értékeket csomagolt bináris formátumba konvertálja. A formátum karakterlánc (fmt) határozza meg a csomagolt adatok elrendezését, és a következő értékek (v1 v2 ...) ennek a formátumnak megfelelően vannak csomagolva. Szintaxis:

struct.pack(fmt v1 v2 ...)

  • fmt : Formátumkarakterlánc, amely meghatározza az adatok csomagolásának módját.
  • v1 v2...: Azok az értékek, amelyek a megadott formátum szerint lesznek csomagolva.
Python
   import   struct   # pack values into binary   var   =   struct  .  pack  (  'hhl'     1     2     3  )   print  (  var  )   var   =   struct  .  pack  (  'iii'     1     2     3  )   print  (  var  )   

Kimenet
b'x01x00x02x00x00x00x00x00x03x00x00x00x00x00x00x00' b'x01x00x00x00x02x00x00x00x03x00x00x00'  

Magyarázat: 'hhl' két rövid egész számot jelent (mindegyik h 2 bájt), amit egy hosszú követ (l általában 4 vagy 8 bájt platformtól függően). 'iii' három 4 bájtos egész számot tartalmaz. A kimenet bájtokban van megadva (b''), ami az értékek bináris kódolását jelenti.

2.struct.unpack(): A csomagolt bináris adatokat visszakonvertálja Python értékekké. Egy formátum karakterláncot (fmt) és egy csomagolt bináris karakterláncot vesz igénybe, és kicsomagolt értékek sorozatát adja vissza. Szintaxis:

struct.unpack(fmt string)

  • fmt: Formátumkarakterlánc, amely meghatározza, hogyan kell az adatokat kicsomagolni.
  • húr: A csomagolt bináris adatok, amelyeket ki kell csomagolni.
Python
   import   struct   var   =   struct  .  pack  (  '?hil'     True     2     5     445  )   print  (  var  )   tup   =   struct  .  unpack  (  '?hil'     var  )   print  (  tup  )   var   =   struct  .  pack  (  'qf'     5     2.3  )   print  (  var  )   tup   =   struct  .  unpack  (  'qf'     var  )   print  (  tup  )   

Kimenet
b'x01x00x02x00x05x00x00x00xbdx01x00x00x00x00x00x00' (True 2 5 445) b'x05x00x00x00x00x00x00x0033x13@' (5 2.299999952316284)  

Magyarázat: Ez a példa először egy logikai értéket (?), egy rövid (h) egy egész számot (i) és egy hosszú (l)-t csomagol bájtokba. Ezután a struct.unpack() segítségével visszakonvertálja Python értékekké. A második rész egy hosszú hosszú egész számot (q) és egy úszót (f) csomagol, majd visszacsomagolja őket. Figyeld meg, hogyan lesz a 2.3-ból 2,299999952... az úszópontosság miatt.

3. struct.calcsize(): A formázási karakterláncnak megfelelő struktúra méretét adja vissza (byte-ban). Hasznos annak meghatározásában, hogy mennyi hely szükséges a csomagolt adatok tárolásához. Szintaxis:

struct.calcsize(fmt)

  • fmt: Az adatelrendezést meghatározó formátum karakterlánc.
Python
   import   struct   print  (  struct  .  calcsize  (  '?hil'  ))   print  (  struct  .  calcsize  (  'qf'  ))   

Kimenet
16 12  

Magyarázat: '?hi' 16 bájtot igényel és 'qf' 12 bájt szükséges az igazítástól és a platformtól függően.

4. struct.pack_into() és struct.unpack_from(): Ezek a módszerek lehetővé teszik az adatok közvetlen be- és kicsomagolását egy pufferbe/pufferből egy adott eltolástól kezdve. Ezek különösen hasznosak az előre lefoglalt memóriapufferek kezelésekor vagy a memóriában tárolt bináris adatokkal való munka során.

A struct.pack_into() szintaxisa:

struct.pack_into(fmt puffer offset v1 v2 ...)

  • fmt: Az adatelrendezést meghatározó formátum karakterlánc.
  • puffer: Írható puffer (pl. ctypes.create_string_buffer).
  • offset: A puffer kezdőpozíciója, ahol a csomagolás kezdődik.
  • v1 v2 ...: A pufferbe csomagolandó értékek.

A struct.unpack_from() szintaxisa:

struct.unpack_from(fmt puffer offset=0)

  • fmt: Az adatelrendezést meghatározó formátum karakterlánc.
  • puffer: A csomagolt adatokat tartalmazó puffer.
  • eltolás: A kicsomagolás kezdőpontja (opcionális)
Python
   import   struct   import   ctypes   # Allocate buffer   size   =   struct  .  calcsize  (  'hhl'  )   buff   =   ctypes  .  create_string_buffer  (  size  )   # Pack into buffer   struct  .  pack_into  (  'hhl'     buff     0     2     2     3  )   # Unpack from buffer   res   =   struct  .  unpack_from  (  'hhl'     buff     0  )   print  (  res  )   

Kimenet
(2 2 3)  

Magyarázat: Itt egy puffer jön létre a ctypes használatával. struct.pack_into() beilleszti az értékeket ebbe a pufferbe a megadott eltolásnál (ebben az esetben 0). struct.unpack_from() majd visszaolvassa az adatokat a pufferből.

A formátum sorrendjének hatása

A formátum karakterek sorrendje megváltoztathatja a csomagolt kimenetet a kitöltés és az igazítás miatt. Ez hatással van az eredmény bájttartalmára és méretére is.

Python
   import   struct   var   =   struct  .  pack  (  'bi'     56     0x12131415  )   print  (  var  )   print  (  struct  .  calcsize  (  'bi'  ))   var   =   struct  .  pack  (  'ib'     0x12131415     56  )   print  (  var  )   print  (  struct  .  calcsize  (  'ib'  ))   

Kimenet
b'8x00x00x00x15x14x13x12' 8 b'x15x14x13x128' 5  

Magyarázat: 'bi' (byte int) tartalmazhat kitöltést a bájt után, míg "ib" (int byte) nincs rá szüksége. A méretkülönbség (8 vs 5) megmutatja, hogy az igazítás hogyan befolyásolja a memória elrendezését.

Kezelési hibák

Ha rossz adattípust használ a struct.pack() függvényben, struct.error lép fel. Használja a try-t, kivéve az ilyen esetek biztonságos kezelését.

Python
   import   struct   try  :   struct  .  pack  (  'h'     'invalid'  )   # Wrong type 'invalid' is a string but 'h' expects an integer   except   struct  .  error   as   e  :   print  (  f  'Struct Error:   {  e  }  '  )   

Kimenet

 Struct Error: required argument is not an integer   

Magyarázat: Ez a hibakezelést mutatja a struct használatakor. A 'h' rövid egész számot vár, de egy karakterlánc ('invalid') struct.error-t okoz. A try-except blokk rögzíti a hibát, és értelmes üzenetet nyomtat.

Referencia https://docs.python.org/2/library/struct.html

Kvíz létrehozása