струцт модул у Питхон-у
Тхе струцт модул ин Питхон омогућава вам да радите са бинарним подацима пружајући функционалност за конверзију између Питхон вредности и бинарних података у Ц стилу. Ово је посебно корисно када се ради о форматима бинарних датотека или мрежним протоколима. Његове кључне карактеристике укључују:
- Паковање претворити Питхон вредности у бинарне податке (бајтове).
- Распакивање претворити бинарне податке назад у Питхон вредности.
- Формат Стринг дефинишете како се подаци пакују/распакују помоћу кодова формата (нпр. и за целе бројеве ф за флоат).
Методе у струцт.пацк()
1.Струцт.пацк(): Конвертује Питхон вредности у упаковани бинарни формат. Низ формата (фмт) специфицира распоред упакованих података и следеће вредности (в1 в2 ...) се пакују у складу са овим форматом. Синтакса:
струцт.пацк(фмт в1 в2 ...)
- фмт : Низ формата који одређује како ће подаци бити упаковани.
- в1 в2 ...: Вредности које ће бити упаковане према наведеном формату.
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.струцт.унпацк(): Конвертује упаковане бинарне податке назад у Питхон вредности. Узима стринг формата (фмт) и упаковани бинарни стринг и враћа низ неупакованих вредности. Синтакса:
струцт.унпацк(фмт стринг)
- фмт: Низ формата који наводи како подаци треба да се распакују.
- стринг: Упаковани бинарни подаци које треба распаковати.
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. струцт.цалцсизе(): Враћа величину (у бајтовима) структуре која одговара стрингу формата. Корисно је за одређивање колико простора је потребно за складиштење упакованих података. Синтакса:
струцт.цалцсизе(фмт)
- фмт: Низ формата који специфицира распоред података.
import struct print ( struct . calcsize ( '?hil' )) print ( struct . calcsize ( 'qf' ))
Излаз
16 12
Објашњење: '?хил' захтева 16 бајтова и 'кф' потребно је 12 бајтова у зависности од поравнања и платформе.
4. струцт.пацк_инто() и струцт.унпацк_фром(): Ове методе вам омогућавају да директно пакујете и распакујете податке у/из бафера почевши од датог одступања. Ово је посебно корисно када се ради са унапред додељеним меморијским баферима или када радите са бинарним подацима ускладиштеним у меморији.
Синтакса за струцт.пацк_инто():
струцт.пацк_инто(фмт помак бафера в1 в2 ...)
- фмт: Низ формата који специфицира распоред података.
- бафер: бафер за писање (нпр. цтипес.цреате_стринг_буффер).
- оффсет: Почетна позиција у баферу где почиње паковање.
- в1 в2 ...: Вредности које треба спаковати у бафер.
Синтакса за струцт.унпацк_фром():
струцт.унпацк_фром(фмт бафер оффсет=0)
- фмт: Низ формата који специфицира распоред података.
- тампон: Бафер који садржи упаковане податке.
- офсет: Почетна позиција одакле почиње распакивање (опционо)
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/либрари/струцт.хтмл
Креирај квиз