modulul struct în Python

The modulul struct în Piton vă permite să lucrați cu date binare, oferind funcționalitate de conversie între valorile Python și datele binare în stil C. Acest lucru este util în special atunci când aveți de-a face cu formate de fișiere binare sau protocoale de rețea. Caracteristicile cheie includ:

  • Ambalare convertiți valorile Python în date binare (octeți).
  • Despachetarea converti datele binare înapoi în valori Python.
  • Formatați șiruri definiți modul în care datele sunt împachetate/despachetate folosind coduri de format (de exemplu, i pentru numere întregi f pentru floats).

Metode din struct.pack()

1.Struct.pack(): Convertește valorile Python într-un format binar împachetat. Șirul de format (fmt) specifică aspectul datelor împachetate, iar valorile ulterioare (v1 v2 ...) sunt împachetate în conformitate cu acest format. Sintaxă:

struct.pack(fmt v1 v2...)

  • fmt : Un șir de format care specifică modul în care vor fi împachetate datele.
  • v1 v2...: Valorile care vor fi ambalate conform formatului specificat.
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  )   

Ieșire
b'x01x00x02x00x00x00x00x00x03x00x00x00x00x00x00x00' b'x01x00x00x00x02x00x00x00x03x00x00x00'  

Explicație: „hhl” înseamnă două numere întregi scurte (h 2 octeți fiecare) urmate de un lung (l de obicei 4 sau 8 octeți, în funcție de platformă). 'iii' împachetează trei numere întregi de 4 octeți. Ieșirea este în octeți (b'') reprezentând codificarea binară a valorilor.

2.struct.unpack(): Convertește datele binare împachetate înapoi în valori Python. Ia un șir de format (fmt) și un șir binar împachetat și returnează un tuplu de valori dezambalate. Sintaxă:

struct.unpack (șir fmt)

  • fmt: Un șir de format care specifică modul în care datele ar trebui să fie despachetate.
  • şir: Datele binare împachetate care trebuie despachetate.
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  )   

Ieșire
b'x01x00x02x00x05x00x00x00xbdx01x00x00x00x00x00x00' (True 2 5 445) b'x05x00x00x00x00x00x00x0033x13@' (5 2.299999952316284)  

Explicaţie: Acest exemplu include mai întâi un boolean (?) un scurt (h) un întreg (i) și un lung (l) în octeți. Apoi struct.unpack() este folosit pentru a-l converti înapoi în valori Python. A doua parte împachetează un întreg lung lung (q) și un float (f), apoi le despachetează înapoi. Observați cum 2.3 devine 2.299999952... datorită preciziei float.

3. struct.calcsize(): Returnează dimensiunea (în octeți) a unei structuri corespunzătoare șirului de format. Este util pentru a determina cât spațiu este necesar pentru stocarea datelor împachetate. Sintaxă:

struct.calcsize(fmt)

  • fmt: Un șir de format care specifică aspectul datelor.
Python
   import   struct   print  (  struct  .  calcsize  (  '?hil'  ))   print  (  struct  .  calcsize  (  'qf'  ))   

Ieșire
16 12  

Explicație: '?hil' necesită 16 octeți și 'qf' are nevoie de 12 octeți, în funcție de aliniere și platformă.

4. struct.pack_into() și struct.unpack_from(): Aceste metode vă permit să împachetați și să despachetați direct datele într-un/din buffer, începând cu un anumit offset. Acestea sunt deosebit de utile atunci când aveți de-a face cu bufferele de memorie prealocate sau când lucrați cu date binare stocate în memorie.

Sintaxă pentru struct.pack_into():

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

  • fmt: Un șir de format care specifică aspectul datelor.
  • buffer: un buffer care poate fi scris (de exemplu, ctypes.create_string_buffer).
  • offset: Poziția de pornire în buffer unde începe ambalarea.
  • v1 v2 ...: Valorile care trebuie împachetate în buffer.

Sintaxă pentru struct.unpack_from():

struct.unpack_from(fmt buffer offset=0)

  • fmt: Un șir de format care specifică aspectul datelor.
  • tampon: Buffer-ul care conține datele împachetate.
  • compensare: Poziția de pornire de unde începe despachetarea (opțional)
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  )   

Ieșire
(2 2 3)  

Explicaţie: Aici este creat un buffer folosind ctypes. struct.pack_into() inserează valorile în acest buffer la offset-ul specificat (0 în acest caz). struct.unpack_from() apoi citește datele înapoi din buffer.

Efectul ordinii de format

Ordinea caracterelor de format poate modifica rezultatul împachetat din cauza umpluturii și alinierii. Acest lucru afectează atât conținutul de octeți, cât și dimensiunea rezultatului.

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

Ieșire
b'8x00x00x00x15x14x13x12' 8 b'x15x14x13x128' 5  

Explicație: „bi” (byte int) ar putea include umplutură după octet în timp ce „ib” (octet int) nu are nevoie. Diferența de dimensiune (8 vs 5) arată modul în care alinierea afectează aspectul memoriei.

Manevrarea erorilor

Dacă se folosește un tip de date greșit cu struct.pack() apare un struct.error. Utilizați try-except pentru a gestiona astfel de cazuri în siguranță.

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

Ieșire

 Struct Error: required argument is not an integer   

Explicaţie: Aceasta arată gestionarea erorilor când se utilizează struct. „h” așteaptă un număr întreg scurt, dar este dat un șir („invalid”) care provoacă o struct.error. Blocul try-except captează eroarea și tipărește un mesaj semnificativ.

Referinţă https://docs.python.org/2/library/struct.html

Creați un test