struct modul v Pythone
The modul struct v Python vám umožňuje pracovať s binárnymi údajmi poskytovaním funkcií na konverziu medzi hodnotami Pythonu a binárnymi údajmi v štýle C. To je užitočné najmä pri práci s binárnymi formátmi súborov alebo sieťovými protokolmi. Medzi jeho kľúčové vlastnosti patrí:
- Balenie konvertovať hodnoty Pythonu na binárne dáta (bajty).
- Rozbaľovanie konvertovať binárne dáta späť na hodnoty Pythonu.
- Formátovať reťazce definujte, ako sa dáta balia/rozbaľujú pomocou formátových kódov (napr. i pre celé čísla f pre pohyblivé čísla).
Metódy v struct.pack()
1.Struct.pack(): Prevádza hodnoty Pythonu do zbaleného binárneho formátu. Formátovací reťazec (fmt) určuje rozloženie komprimovaných dát a následné hodnoty (v1 v2 ...) sú zbalené podľa tohto formátu. Syntax:
struct.pack(fmt v1 v2 ...)
- fmt : Formátovací reťazec, ktorý určuje, ako budú dáta zabalené.
- v1 v2 ...: Hodnoty, ktoré budú zabalené podľa určeného formátu.
import struct # pack values into binary var = struct . pack ( 'hhl' 1 2 3 ) print ( var ) var = struct . pack ( 'iii' 1 2 3 ) print ( var )
Výstup
b'x01x00x02x00x00x00x00x00x03x00x00x00x00x00x00x00' b'x01x00x00x00x02x00x00x00x03x00x00x00'
Vysvetlenie: 'hhl' znamená dve krátke celé čísla (h 2 bajty každé) nasledované dlhým (l zvyčajne 4 alebo 8 bajtov v závislosti od platformy). 'iii' zbalí tri 4-bajtové celé čísla. Výstup je v bajtoch (b''), ktoré predstavujú binárne kódovanie hodnôt.
2.struct.unpack(): Prevádza zabalené binárne dáta späť na hodnoty Pythonu. Berie formátovací reťazec (fmt) a zbalený binárny reťazec a vracia n-ticu rozbalených hodnôt. Syntax:
struct.unpack(fmt string)
- fmt: Formátovací reťazec, ktorý určuje, ako sa majú údaje rozbaliť.
- reťazec: Zbalené binárne dáta, ktoré je potrebné rozbaliť.
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 )
Výstup
b'x01x00x02x00x05x00x00x00xbdx01x00x00x00x00x00x00' (True 2 5 445) b'x05x00x00x00x00x00x00x0033x13@' (5 2.299999952316284)
Vysvetlenie: Tento príklad najprv zabalí booleovský (?), krátky (h), celé číslo (i) a dlhý (l) do bajtov. Potom sa použije struct.unpack() na konverziu späť na hodnoty Pythonu. Druhá časť obsahuje dlhé dlhé celé číslo (q) a plavák (f) a potom ich rozbalí späť. Všimnite si, ako sa z 2.3 stane 2,299999952... kvôli presnosti s pohyblivou čiarou.
3. struct.calcsize(): Vráti veľkosť (v bajtoch) štruktúry zodpovedajúcej formátovaciemu reťazcu. Je to užitočné pri určovaní, koľko miesta je potrebné na uloženie zbalených údajov. Syntax:
struct.calcsize(fmt)
- fmt: Formátovací reťazec, ktorý určuje rozloženie údajov.
import struct print ( struct . calcsize ( '?hil' )) print ( struct . calcsize ( 'qf' ))
Výstup
16 12
Vysvetlenie: '?hil' vyžaduje 16 bajtov a 'qf' potrebuje 12 bajtov v závislosti od zarovnania a platformy.
4. struct.pack_into() a struct.unpack_from(): Tieto metódy vám umožňujú priamo zabaliť a rozbaliť dáta do/z vyrovnávacej pamäte počnúc daným posunom. Tieto sú obzvlášť užitočné pri práci s vopred pridelenými vyrovnávacími pamäťami alebo pri práci s binárnymi údajmi uloženými v pamäti.
Syntax pre struct.pack_into():
struct.pack_into(fmt vyrovnávacia pamäť v1 v2 ...)
- fmt: Formátovací reťazec určujúci rozloženie údajov.
- vyrovnávacia pamäť: zapisovateľná vyrovnávacia pamäť (napr. ctypes.create_string_buffer).
- offset: Počiatočná pozícia vo vyrovnávacej pamäti, kde začína balenie.
- v1 v2 ...: Hodnoty, ktoré sa majú vložiť do vyrovnávacej pamäte.
Syntax pre struct.unpack_from():
struct.unpack_from(fmt vyrovnávacia pamäť = 0)
- fmt: Formátovací reťazec určujúci rozloženie údajov.
- vyrovnávacia pamäť: Vyrovnávacia pamäť obsahujúca zbalené dáta.
- posun: Počiatočná pozícia, z ktorej sa začína vybaľovanie (voliteľné)
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 )
Výstup
(2 2 3)
Vysvetlenie: Tu sa vytvorí vyrovnávacia pamäť pomocou ctypes. struct.pack_into() vloží hodnoty do tejto vyrovnávacej pamäte so zadaným posunom (v tomto prípade 0). struct.unpack_from() potom načíta údaje späť z vyrovnávacej pamäte.
Účinok poradia formátu
Poradie formátových znakov môže zmeniť zbalený výstup v dôsledku výplne a zarovnania. To ovplyvňuje obsah bajtov aj veľkosť výsledku.
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' ))
Výstup
b'8x00x00x00x15x14x13x12' 8 b'x15x14x13x128' 5
Vysvetlenie: 'bi' (byte int) môže zahŕňať výplň za byte, zatiaľ čo 'ib' (int byte) nepotrebuje to. Rozdiel veľkosti (8 vs 5) ukazuje, ako zarovnanie ovplyvňuje rozloženie pamäte.
Manipulačné chyby
Ak sa pri struct.pack() použije nesprávny typ údajov, objaví sa chyba struct.error. Na bezpečné zvládnutie takýchto prípadov použite try-okrem.
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 } ' )
Výstup
Struct Error: required argument is not an integer
Vysvetlenie: Toto ukazuje spracovanie chýb pri použití struct. 'h' očakáva krátke celé číslo, ale zadaný reťazec ('neplatný') spôsobí chybu struct.error. Blok try-except zachytí chybu a vytlačí zmysluplnú správu.
Odkaz https://docs.python.org/2/library/struct.html
Vytvoriť kvíz