Құру (питон кітапханасы) - Construct (python library)

Салу Бұл Python салу және деконструкциялауға арналған кітапхана мәліметтер құрылымы ішінде декларативті сән. Бұл тұрғыда құрылыс немесе ғимарат түрлендіру процесін білдіреді (сериялау ) екілік көрініске бағдарламалық объект. Деконструкция немесе талдау, екілік деректерді бағдарламалық объектіге түрлендірудің (десериализациялау) қарама-қарсы процесін білдіреді. Декларативті болу дегеніміз - қолданушы коды жазу конвенциясының орнына мәліметтер құрылымын анықтайды іс жүргізу кодексі мақсатты орындау. Құрылыс үздіксіз жұмыс істей алады бит - және байт -мәліметтердің деңгейлілігі және әртүрлі байтқа тапсырыс беру.

Декларативті кодты қолданудың көптеген артықшылықтары бар. Мысалы, бір кодты құрастыра алады (симметриялы), күйін келтіру және тестілеу әлдеқайда қарапайым (белгілі бір дәрежеде дәлелденеді), жаңа құрылымдар жасау оңай (компоненттерді орау) және басқалары. Егер біреу таныс болса C (бағдарламалау тілі), конструкцияларды былайша ойлауға болады кастинг бастап char * дейін құрылым foo * және керісінше, деректерді шығаратын код жазудан гөрі.

Мысал

Келесі мысалда а TCP / IP хаттама стегі Construct көмегімен анықталуы мүмкін; қысқалығы мен қарапайымдылығы үшін кейбір кодтар алынып тасталады. Келесі код тек объектілерді жасайтын Python коды екенін ескеріңіз.

Біріншіден Ethernet тақырып (2 қабат):

 Ethernet = Құрылым(«ethernet_header»,    Байт(«баратын жер», 6),    Байт(«дереккөз», 6),    Энум(UBInt16(«тип»),        IPv4=0x0800,        ARP=0x0806,        RARP=0x8035,        X25=0x0805,        IPX=0x8137,        IPv6=0x86DD,    ), )

Келесі IP тақырып (3 қабат):

 ip = Құрылым(«ip_header»,    EmbeddedBitStruct(        Конст(Ниббл(«нұсқа»), 4),        Ниббл(«header_length»),    ),    BitStruct(«tos»,        Биттер(«басымдық», 3),        Жалау(«minimize_delay»),        Жалау(«жоғары_пісіру»),        Жалау(«жоғары_сенімділік»),        Жалау(«минимизация_кост»),        Толтырғыш(1),    ),    UBInt16(«толық ұзындығы»),    # ... )

Соңында TCP тақырып (4 қабат):

 tcp = Құрылым(«tcp_header»,    UBInt16(«дереккөз»),    UBInt16(«баратын жер»),    UBInt32(«сегіздік»),    UBInt32(«акк»),    # ... )

Енді хаттама стегінің иерархиясын анықтаңыз. Төмендегі код көршілес протоколдардың әр жұбын жеке бірлікке «байланыстырады». Әрбір осындай бөлім тиісті хаттамаға негізделген келесі қабатты «таңдайды».

 қабат4tcp = Құрылым(«қабат4»,    Ендіру(tcp),    # ... пайдалы жүктеме ) қабат3ip = Құрылым(«қабат3»,    Ендіру(ip),    Ауыстыру(«Келесі», лямбда ctx: ctx[«хаттама»],        {            «TCP» : қабат4tcp,        }    ), ) layer2ethernet = Құрылым(«қабат2»,    Ендіру(Ethernet),    Ауыстыру(«Келесі», лямбда ctx: ctx[«тип»],        {            «IP» : қабат3ip,        }    ), )

Осы кезде код алынған TCP / IP фреймдерін «пакеттік» нысандарға талдай алады және осы пакеттік объектілерді екілік көрініске қайта құра алады.

 tcpip_stack = layer2ethernet pkt = tcpip_stack.талдау(«... шикі түсірілген пакет ...») шикі_мәліметтер = tcpip_stack.салу(pkt)

Порттар мен айналдыру

Перл

Деректер :: ParseBinary Бұл CPAN а дейін Construct порты ретінде пайда болған модуль Perl бағдарламалау тілі. (қараңыз оның негізгі POD құжаты оны шабыттандырғаны үшін). Бастапқы нұсқадан бастап, түпнұсқа API-нің кейбір бөліктері ескірді.

Java

Java портына қол жетімді GitHub.Мысалдар, Java Ethernet тақырып (2 қабат):

 Салу ethernet_header = Құрылым(«ethernet_header»,      MacAddress(«баратын жер»),      MacAddress(«дереккөз»),      Энум(UBInt16(«тип»),          «IPv4»,  0x0800,          «ARP»,   0x0806,          «RARP»,  0x8035,          «X25»,   0x0805,          «IPX»,   0x8137,          «IPv6»,  0x86DD,          «_default_»,  Өту   ));

Сыртқы сілтемелер