logo

struct modulis Python

The struktūras modulis iekšā Python ļauj strādāt ar binārajiem datiem, nodrošinot funkcionalitāti, lai pārveidotu Python vērtības un C stila bināros datus. Tas ir īpaši noderīgi, strādājot ar binārajiem failu formātiem vai tīkla protokoliem. Tās galvenās funkcijas ietver:

  • Iepakošana pārvērst Python vērtības bināros datos (baitos).
  • Izpakošana konvertēt bināros datus atpakaļ Python vērtībās.
  • Formatēt virknes definējiet, kā dati tiek iesaiņoti/izpakoti, izmantojot formāta kodus (piemēram, i veseliem skaitļiem f pludiņiem).

Metodes failā struct.pack()

1.Struct.pack(): Tas pārvērš Python vērtības iepakotā binārā formātā. Formāta virkne (fmt) norāda iepakoto datu izkārtojumu, un turpmākās vērtības (v1 v2 ...) tiek iesaiņotas atbilstoši šim formātam. Sintakse:

struct.pack(fmt v1 v2 ...)



  • fmt : formāta virkne, kas norāda, kā dati tiks iesaiņoti.
  • v1 v2...: Vērtības, kas tiks iepakotas atbilstoši norādītajam formātam.
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) 

Izvade
b'x01x00x02x00x00x00x00x00x03x00x00x00x00x00x00x00' b'x01x00x00x00x02x00x00x00x03x00x00x00' 

Paskaidrojums: "hhl" nozīmē divus īsus veselus skaitļus (katrs h 2 baiti), kam seko garais (l parasti 4 vai 8 baiti atkarībā no platformas). 'iii' iesaiņo trīs 4 baitu veselus skaitļus. Izvade ir baitos (b''), kas attēlo vērtību bināro kodējumu.

2.struct.unpack(): Tas pārvērš iepakotos bināros datus atpakaļ Python vērtībās. Tas aizņem formāta virkni (fmt) un iepakotu bināro virkni un atgriež neizpakotu vērtību virkni. Sintakse:

struct.unpack(fmt virkne)

  • fmt: Formāta virkne, kas norāda, kā dati ir jāizpako.
  • virkne: Iepakotie binārie dati, kas ir jāizpako.
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) 

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

Paskaidrojums: Šis piemērs vispirms baitos iepako Būla vērtību (?), īsu (h) veselu skaitli (i) un garo (l). Pēc tam struct.unpack() tiek izmantots, lai to pārvērstu atpakaļ Python vērtībās. Otrajā daļā tiek ievietots garš vesels skaitlis (q) un pludiņš (f), pēc tam tos izpako atpakaļ. Ņemiet vērā, kā 2.3 kļūst par 2.299999952... pludiņa precizitātes dēļ.

3. struct.calcsize(): Tas atgriež struktūras izmēru (baitos), kas atbilst formāta virknei. Tas ir noderīgi, lai noteiktu, cik daudz vietas ir nepieciešams pakoto datu glabāšanai. Sintakse:

pievienot virkni java

struct.calcsize(fmt)

  • fmt: formāta virkne, kas norāda datu izkārtojumu.
Python
import struct print(struct.calcsize('?hil')) print(struct.calcsize('qf')) 

Izvade
16 12 

Paskaidrojums: '?hil' nepieciešami 16 baiti un 'qf' nepieciešami 12 baiti atkarībā no izlīdzināšanas un platformas.

4. struct.pack_into() un struct.unpack_from(): Šīs metodes ļauj tieši iepakot un izpakot datus buferī/no tā, sākot ar noteiktu nobīdi. Tie ir īpaši noderīgi, strādājot ar iepriekš piešķirtajiem atmiņas buferiem vai strādājot ar atmiņā saglabātajiem binārajiem datiem.

Sintakse failam struct.pack_into():

struct.pack_into(fmt bufera nobīde v1 v2 ...)

  • fmt: formāta virkne, kas norāda datu izkārtojumu.
  • buferis: rakstāms buferis (piemēram, ctypes.create_string_buffer).
  • nobīde: sākuma pozīcija buferī, kur sākas iepakošana.
  • v1 v2 ...: vērtības, kas jāiepako buferī.

Sintakse failam struct.unpack_from():

struct.unpack_from(fmt bufera nobīde=0)

  • fmt: Formāta virkne, kas norāda datu izkārtojumu.
  • buferis: Buferis, kurā ir iepakotie dati.
  • nobīde: Sākuma pozīcija, no kuras sākas izpakošana (pēc izvēles)
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) 

Izvade
(2 2 3) 

Paskaidrojums: Šeit tiek izveidots buferis, izmantojot ctypes. struct.pack_into() ievieto vērtības šajā buferī norādītajā nobīdē (šajā gadījumā 0). struct.unpack_from() pēc tam nolasa datus atpakaļ no bufera.

Formātu secības efekts

Formātu rakstzīmju secība var mainīt iepakoto izvadi polsterējuma un izlīdzināšanas dēļ. Tas ietekmē gan baitu saturu, gan rezultāta lielumu.

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

Izvade
b'8x00x00x00x15x14x13x12' 8 b'x15x14x13x128' 5 

Paskaidrojums: 'bi' (baitu int) var ietvert polsterējumu aiz baita, savukārt "ib" (int baits) to nevajag. Lieluma atšķirība (8 pret 5) parāda, kā izlīdzināšana ietekmē atmiņas izkārtojumu.

Apstrādes kļūdas

Ja ar struct.pack() tiek izmantots nepareizs datu tips, rodas struct.error. Izmantojiet izmēģināšanu, izņemot, lai droši rīkoties šādos gadījumos.

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

Izvade

Struct Error: required argument is not an integer  

Paskaidrojums: Tas parāda kļūdu apstrādi, izmantojot struct. "h" sagaida īsu veselu skaitli, bet tiek dota virkne ("nederīga"), kas izraisa struct.error. Izmēģināšanas bloks fiksē kļūdu un izdrukā nozīmīgu ziņojumu.

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