струцт модул у Питхон-у

Тхе струцт модул ин Питхон омогућава вам да радите са бинарним подацима пружајући функционалност за конверзију између Питхон вредности и бинарних података у Ц стилу. Ово је посебно корисно када се ради о форматима бинарних датотека или мрежним протоколима. Његове кључне карактеристике укључују:

  • Паковање претворити Питхон вредности у бинарне податке (бајтове).
  • Распакивање претворити бинарне податке назад у Питхон вредности.
  • Формат Стринг дефинишете како се подаци пакују/распакују помоћу кодова формата (нпр. и за целе бројеве ф за флоат).

Методе у струцт.пацк()

1.Струцт.пацк(): Конвертује Питхон вредности у упаковани бинарни формат. Низ формата (фмт) специфицира распоред упакованих података и следеће вредности (в1 в2 ...) се пакују у складу са овим форматом. Синтакса:

струцт.пацк(фмт в1 в2 ...)

  • фмт : Низ формата који одређује како ће подаци бити упаковани.
  • в1 в2 ...: Вредности које ће бити упаковане према наведеном формату.
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  )   

Излаз
b'x01x00x02x00x00x00x00x00x03x00x00x00x00x00x00x00' b'x01x00x00x00x02x00x00x00x03x00x00x00'  

Објашњење: 'ххл' означава два кратка цела броја (х по 2 бајта сваки) иза којих следи дуг (л обично 4 или 8 бајтова у зависности од платформе). 'иии' пакује три цела броја од 4 бајта. Излаз је у бајтовима (б'') који представља бинарно кодирање вредности.

2.струцт.унпацк(): Конвертује упаковане бинарне податке назад у Питхон вредности. Узима стринг формата (фмт) и упаковани бинарни стринг и враћа низ неупакованих вредности. Синтакса:

струцт.унпацк(фмт стринг)

  • фмт: Низ формата који наводи како подаци треба да се распакују.
  • стринг: Упаковани бинарни подаци које треба распаковати.
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  )   

Излаз
b'x01x00x02x00x05x00x00x00xbdx01x00x00x00x00x00x00' (True 2 5 445) b'x05x00x00x00x00x00x00x0033x13@' (5 2.299999952316284)  

Објашњење: Овај пример прво пакује логички (?), кратки (х), цео број (и) и дуг (л) у бајтове. Затим се струцт.унпацк() користи за конвертовање назад у Питхон вредности. Други део пакује дугачак дуг цео број (к) и флоат (ф), а затим их распакује назад. Обратите пажњу на то како 2.3 постаје 2.299999952... због прецизности са плутањем.

3. струцт.цалцсизе(): Враћа величину (у бајтовима) структуре која одговара стрингу формата. Корисно је за одређивање колико простора је потребно за складиштење упакованих података. Синтакса:

струцт.цалцсизе(фмт)

  • фмт: Низ формата који специфицира распоред података.
Python
   import   struct   print  (  struct  .  calcsize  (  '?hil'  ))   print  (  struct  .  calcsize  (  'qf'  ))   

Излаз
16 12  

Објашњење: '?хил' захтева 16 бајтова и 'кф' потребно је 12 бајтова у зависности од поравнања и платформе.

4. струцт.пацк_инто() и струцт.унпацк_фром(): Ове методе вам омогућавају да директно пакујете и распакујете податке у/из бафера почевши од датог одступања. Ово је посебно корисно када се ради са унапред додељеним меморијским баферима или када радите са бинарним подацима ускладиштеним у меморији.

Синтакса за струцт.пацк_инто():

струцт.пацк_инто(фмт помак бафера в1 в2 ...)

  • фмт: Низ формата који специфицира распоред података.
  • бафер: бафер за писање (нпр. цтипес.цреате_стринг_буффер).
  • оффсет: Почетна позиција у баферу где почиње паковање.
  • в1 в2 ...: Вредности које треба спаковати у бафер.

Синтакса за струцт.унпацк_фром():

струцт.унпацк_фром(фмт бафер оффсет=0)

  • фмт: Низ формата који специфицира распоред података.
  • тампон: Бафер који садржи упаковане податке.
  • офсет: Почетна позиција одакле почиње распакивање (опционо)
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  )   

Излаз
(2 2 3)  

Објашњење: Овде се бафер креира помоћу цтипес. струцт.пацк_инто() убацује вредности у овај бафер на наведеном офсету (0 у овом случају). струцт.унпацк_фром() затим чита податке назад из бафера.

Ефекат редоследа формата

Редослед знакова формата може да промени упаковани излаз због допуна и поравнања. Ово утиче и на садржај бајтова и на величину резултата.

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

Излаз
b'8x00x00x00x15x14x13x12' 8 b'x15x14x13x128' 5  

Објашњење: 'би' (бајт инт) може укључивати допуну након бајта док 'иб' (инт бите) не треба. Разлика у величини (8 према 5) показује како поравнање утиче на распоред меморије.

Руковање грешкама

Ако се са струцт.пацк() користи погрешан тип података, долази до струцт.еррор. Користите три-екцепт за безбедно руковање таквим случајевима.

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

Излаз

 Struct Error: required argument is not an integer   

Објашњење: Ово показује руковање грешкама када се користи структура. 'х' очекује кратак цео број, али је дат низ ('неважећи') који узрокује струцт.еррор. Блок три-екцепт хвата грешку и штампа значајну поруку.

Референца хттпс://доцс.питхон.орг/2/либрари/струцт.хтмл

Креирај квиз

Топ Чланци

Категорија