logo

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)

ls comandă Linux
  • 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 număr î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)

diferența dintre dragoste și placere
  • 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