logo

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.

window.open javascript

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)

osi referenciamodell a hálózatépítésben
  • 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.

linux parancsok, amelyek

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.

java konvertálja a karaktert sztringgé
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