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:

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āta rakstzīmju secība var mainīt iesaiņoto 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

Izveidojiet viktorīnu