struct-moduuli Pythonissa

The struct-moduuli sisään Python voit työskennellä binääritietojen kanssa tarjoamalla toimintoja Python-arvojen ja C-tyylisten binääritietojen muuntamiseen. Tämä on erityisen hyödyllistä, kun käsitellään binääritiedostomuotoja tai verkkoprotokollia. Sen tärkeimpiä ominaisuuksia ovat:

  • Pakkaus muuntaa Python-arvot binääritiedoiksi (tavuiksi).
  • Purkaminen muuntaa binääritiedot takaisin Python-arvoiksi.
  • Muotoile merkkijonot määrittää, kuinka tiedot pakataan/purkataan muotokoodeilla (esim. i kokonaisluvuille f kelluville).

Menetelmät tiedostossa struct.pack()

1.Struct.pack(): Se muuntaa Python-arvot pakattuun binaarimuotoon. Muotomerkkijono (fmt) määrittää pakattujen tietojen asettelun ja seuraavat arvot (v1 v2 ...) pakataan tämän muodon mukaan. Syntaksi:

struct.pack(fmt v1 v2 ...)

  • fmt : Muotomerkkijono, joka määrittää, kuinka tiedot pakataan.
  • v1 v2...: Arvot, jotka pakataan määritetyn muodon mukaan.
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  )   

Lähtö
b'x01x00x02x00x00x00x00x00x03x00x00x00x00x00x00x00' b'x01x00x00x00x02x00x00x00x03x00x00x00'  

Selitys: 'hhl' tarkoittaa kahta lyhyttä kokonaislukua (h 2 tavua kumpikin), jota seuraa pitkä (l yleensä 4 tai 8 tavua alustasta riippuen). 'iii' pakkaa kolme 4-tavuista kokonaislukua. Tulos on tavuissa (b''), jotka edustavat arvojen binaarista koodausta.

2.struct.unpack(): Se muuntaa pakatut binääritiedot takaisin Python-arvoiksi. Se ottaa muotomerkkijonon (fmt) ja pakatun binäärimerkkijonon ja palauttaa joukon pakkaamattomia arvoja. Syntaksi:

struct.unpack(fmt string)

  • fmt: Muotomerkkijono, joka määrittää, kuinka tiedot tulee purkaa.
  • merkkijono: Pakatut binaaritiedot, jotka on purettava.
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  )   

Lähtö
b'x01x00x02x00x05x00x00x00xbdx01x00x00x00x00x00x00' (True 2 5 445) b'x05x00x00x00x00x00x00x0033x13@' (5 2.299999952316284)  

Selitys: Tämä esimerkki pakkaa ensin boolen (?), lyhyen (h) kokonaisluvun (i) ja pitkän (l) tavuiksi. Sitten struct.unpack() muuntaa sen takaisin Python-arvoiksi. Toinen osa pakkaa pitkän pitkän kokonaisluvun (q) ja kellukkeen (f) ja purkaa ne sitten takaisin. Huomaa, kuinka 2.3:sta tulee 2,299999952... kelluntatarkkuuden vuoksi.

3. struct.calcsize(): Se palauttaa muotomerkkijonoa vastaavan rakenteen koon (tavuina). Se on hyödyllinen määritettäessä, kuinka paljon tilaa tarvitaan pakattujen tietojen tallentamiseen. Syntaksi:

struct.calcsize(fmt)

  • fmt: muotomerkkijono, joka määrittää tietojen asettelun.
Python
   import   struct   print  (  struct  .  calcsize  (  '?hil'  ))   print  (  struct  .  calcsize  (  'qf'  ))   

Lähtö
16 12  

Selitys: '?hilja' vaatii 16 tavua ja 'qf' tarvitsee 12 tavua kohdistuksesta ja alustasta riippuen.

4. struct.pack_into() ja struct.unpack_from(): Näiden menetelmien avulla voit pakata ja purkaa tietoja suoraan puskuriin/puskurista alkaen annetusta siirrosta. Nämä ovat erityisen hyödyllisiä käsiteltäessä ennalta varattuja muistipuskureita tai kun työskennellään muistiin tallennettujen binääritietojen kanssa.

Kohteen struct.pack_into() syntaksi:

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

  • fmt: muotomerkkijono, joka määrittää tietojen asettelun.
  • puskuri: kirjoitettava puskuri (esim. ctypes.create_string_buffer).
  • offset: Puskurin aloituskohta, josta pakkaus alkaa.
  • v1 v2 ...: puskuriin pakattavat arvot.

Syntaksi struct.unpack_from():

struct.unpack_from(fmt buffer offset=0)

  • fmt: Tietojen asettelun määrittävä muotomerkkijono.
  • puskuri: Puskuri, joka sisältää pakatut tiedot.
  • offset: Lähtökohta, josta purkaminen alkaa (valinnainen)
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  )   

Lähtö
(2 2 3)  

Selitys: Tässä puskuri luodaan käyttämällä ctypes. struct.pack_into() lisää arvot tähän puskuriin määritetyllä siirtymällä (tässä tapauksessa 0). struct.unpack_from() sitten lukee tiedot takaisin puskurista.

Muotojärjestyksen vaikutus

Muotomerkkien järjestys voi muuttaa pakattua tulostetta täytetyksen ja tasauksen vuoksi. Tämä vaikuttaa sekä tuloksen tavusisältöön että kokoon.

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

Lähtö
b'8x00x00x00x15x14x13x12' 8 b'x15x14x13x128' 5  

Selitys: 'bi' (tavu int) saattaa sisältää täyttöä tavun jälkeen "ib" (int tavu) ei sitä tarvitse. Kokoero (8 vs 5) osoittaa, kuinka kohdistus vaikuttaa muistin asetteluun.

Käsittelyvirheet

Jos struct.pack():n kanssa käytetään väärää tietotyyppiä, tapahtuu struct.error. Käytä try-paitsi käsitelläksesi tällaisia ​​tapauksia turvallisesti.

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  }  '  )   

Lähtö

 Struct Error: required argument is not an integer   

Selitys: Tämä näyttää virheiden käsittelyn käytettäessä structia. 'h' odottaa lyhyttä kokonaislukua, mutta merkkijono ('invalid') annetaan, mikä aiheuttaa struct.error-virheen. Yritä paitsi -lohko kaappaa virheen ja tulostaa merkityksellisen viestin.

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

Luo tietokilpailu