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

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

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.
Python
   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é)
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  )   

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