struct-modul i Python

De strukturmodul i Python lar deg jobbe med binære data ved å tilby funksjonalitet for å konvertere mellom Python-verdier og C-stil binære data. Dette er spesielt nyttig når du arbeider med binære filformater eller nettverksprotokoller. Dens nøkkelfunksjoner inkluderer:

  • Pakking konvertere Python-verdier til binære data (bytes).
  • Pakker ut konvertere binære data tilbake til Python-verdier.
  • Formater strenger definere hvordan data pakkes/pakkes ut ved hjelp av formatkoder (f.eks. i for heltall f for flyter).

Metoder i struct.pack()

1.Struct.pack(): Den konverterer Python-verdier til et pakket binært format. Formatstrengen (fmt) spesifiserer utformingen av de pakkede dataene og de påfølgende verdiene (v1 v2 ...) er pakket i henhold til dette formatet. Syntaks:

struct.pack(fmt v1 v2 ...)

  • fmt : En formatstreng som spesifiserer hvordan dataene skal pakkes.
  • v1 v2 ...: Verdiene som vil bli pakket i henhold til det angitte formatet.
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  )   

Produksjon
b'x01x00x02x00x00x00x00x00x03x00x00x00x00x00x00x00' b'x01x00x00x00x02x00x00x00x03x00x00x00'  

Forklaring: 'hhl' betyr to korte heltall (h 2 byte hver) etterfulgt av et langt (l vanligvis 4 eller 8 byte avhengig av plattform). 'iii' pakker tre 4-byte heltall. Utgangen er i byte (b'') som representerer den binære kodingen av verdiene.

2.struct.unpack(): Den konverterer pakkede binære data tilbake til Python-verdier. Den tar en formatstreng (fmt) og en pakket binær streng og returnerer en tuppel med upakkede verdier. Syntaks:

struct.unpack(fmt-streng)

  • fmt: En formatstreng som spesifiserer hvordan dataene skal pakkes ut.
  • streng: De pakkede binære dataene som må pakkes ut.
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  )   

Produksjon
b'x01x00x02x00x05x00x00x00xbdx01x00x00x00x00x00x00' (True 2 5 445) b'x05x00x00x00x00x00x00x0033x13@' (5 2.299999952316284)  

Forklaring: Dette eksemplet pakker først en boolsk (?) en kort (h) et heltall (i) og en lang (l) i byte. Deretter brukes struct.unpack() til å konvertere den tilbake til Python-verdier. Den andre delen pakker et langt langt heltall (q) og en float (f) og pakker dem deretter ut igjen. Legg merke til hvordan 2.3 blir 2.299999952... på grunn av flytpresisjon.

3. struct.calcsize(): Den returnerer størrelsen (i byte) til en struktur som tilsvarer formatstrengen. Det er nyttig for å bestemme hvor mye plass som kreves for å lagre pakket data. Syntaks:

struct.calcsize(fmt)

  • fmt: En formatstreng som spesifiserer dataoppsettet.
Python
   import   struct   print  (  struct  .  calcsize  (  '?hil'  ))   print  (  struct  .  calcsize  (  'qf'  ))   

Produksjon
16 12  

Forklaring: '?hil' krever 16 byte og 'qf' trenger 12 byte avhengig av justering og plattform.

4. struct.pack_into() og struct.unpack_from(): Disse metodene lar deg pakke og pakke ut data direkte inn i/fra en buffer som starter med en gitt offset. Disse er spesielt nyttige når du arbeider med forhåndstildelte minnebuffere eller når du arbeider med binære data lagret i minnet.

Syntaks for struct.pack_into():

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

  • fmt: En formatstreng som spesifiserer dataoppsettet.
  • buffer: En skrivbar buffer (f.eks. ctypes.create_string_buffer).
  • offset: Startposisjonen i bufferen der pakkingen begynner.
  • v1 v2 ...: Verdiene som skal pakkes inn i bufferen.

Syntaks for struct.unpack_from():

struct.unpack_from(fmt buffer offset=0)

  • fmt: En formatstreng som spesifiserer dataoppsettet.
  • buffer: Bufferen som inneholder de pakkede dataene.
  • offset: Startposisjonen der utpakkingen begynner (valgfritt)
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  )   

Produksjon
(2 2 3)  

Forklaring: Her lages en buffer ved hjelp av ctypes. struct.pack_into() setter inn verdiene i denne bufferen med spesifisert offset (0 i dette tilfellet). struct.unpack_from() leser deretter dataene tilbake fra bufferen.

Effekt av formatrekkefølge

Rekkefølgen på formattegn kan endre den pakkede utgangen på grunn av utfylling og justering. Dette påvirker både byteinnholdet og størrelsen på resultatet.

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

Produksjon
b'8x00x00x00x15x14x13x12' 8 b'x15x14x13x128' 5  

Forklaring: 'bi' (byte int) kan inkludere utfylling etter byten mens 'ib' (int byte) trenger det ikke. Størrelsesforskjellen (8 vs 5) viser hvordan justering påvirker minneoppsettet.

Håndteringsfeil

Hvis feil datatype brukes med struct.pack() oppstår det en struct.error. Bruk prøve-unntatt for å håndtere slike saker trygt.

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

Produksjon

 Struct Error: required argument is not an integer   

Forklaring: Dette viser feilhåndtering ved bruk av struct. 'h' forventer et kort heltall, men en streng ('ugyldig') er gitt som forårsaker en struct.error. Prøv-unntatt-blokken fanger opp feilen og skriver ut en meningsfull melding.

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

Lag quiz