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.
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.
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.
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)
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.
Pythonimport 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