Построить (библиотека Python) - Construct (python library)

Построить это Python библиотека для строительства и демонтажа структуры данных в декларативный мода. В этом контексте строительство или строительство относится к процессу преобразования (сериализация ) программный объект в двоичное представление. Деконструкция или синтаксический анализ относится к противоположному процессу преобразования (десериализации) двоичных данных в программный объект. Декларативность означает, что код пользователя определяет структуру данных, а не соглашение о записи. процессуальный кодекс для достижения цели. Construct может без проблем работать с немного - и байт -уровневая детализация данных и различные порядок байтов.

Использование декларативного кода имеет много преимуществ. Например, тот же самый код, который может анализировать, также может быть построен (симметрично), отладка и тестирование намного проще (до некоторой степени доказуемо), создание новых конструкций легко (упаковка компонентов) и многое другое. Если вы знакомы с C (язык программирования), можно думать о конструкциях как Кастинг из символ * к struct foo * и наоборот, вместо написания кода, распаковывающего данные.

пример

В следующем примере показано, как TCP / IP стек протоколов может быть определен с помощью Construct; некоторый код опущен для краткости и простоты. Также обратите внимание, что следующий код - это просто код Python, который создает объекты.

Во-первых, Ethernet заголовок (слой 2):

 Ethernet = Struct("ethernet_header",    Байтов("пункт назначения", 6),    Байтов("источник", 6),    Enum(UBInt16("тип"),        IPv4=0x0800,        ARP=0x0806,        RARP=0x8035,        X25=0x0805,        IPX=0x8137,        IPv6=0x86DD,    ), )

Далее IP заголовок (уровень 3):

 ip = Struct("ip_header",    EmbeddedBitStruct(        Const(Клев("версия"), 4),        Клев("длина_заголовка"),    ),    BitStruct("tos",        Биты("приоритет", 3),        Флаг("minim_delay"),        Флаг("high_throuput"),        Флаг("высокая надежность"),        Флаг("minim_cost"),        Прокладка(1),    ),    UBInt16("Общая длина"),    # ... )

И наконец, TCP заголовок (уровень 4):

 tcp = Struct("tcp_header",    UBInt16("источник"),    UBInt16("пункт назначения"),    UBInt32("seq"),    UBInt32("подтверждение"),    # ... )

Теперь определите иерархию стека протоколов. Следующий код «связывает» каждую пару соседних протоколов в отдельный блок. Каждый такой модуль будет «выбирать» соответствующий следующий уровень на основе содержащегося в нем протокола.

 layer4tcp = Struct("слой4",    Встроить(tcp),    # ... полезная нагрузка ) layer3ip = Struct("слой3",    Встроить(ip),    Переключатель("следующий", лямбда ctx: ctx["протокол"],        {            «TCP» : layer4tcp,        }    ), ) layer2ethernet = Struct("слой2",    Встроить(Ethernet),    Переключатель("следующий", лямбда ctx: ctx["тип"],        {            "IP" : layer3ip,        }    ), )

На этом этапе код может анализировать захваченные кадры TCP / IP на «пакетные» объекты и преобразовывать эти пакетные объекты обратно в двоичное представление.

 tcpip_stack = layer2ethernet pkt = tcpip_stack.разбирать("... необработанный захваченный пакет ...") необработанные данные = tcpip_stack.строить(pkt)

Порты и спин-оффы

Perl

Данные :: ParseBinary это CPAN модуль, который возник как порт Construct для Язык программирования Perl. (увидеть его основной документ POD за его вдохновение). Начиная с начальной версии, некоторые части исходного API устарели.

Ява

Порт на Java доступен на GitHub. Примеры в Java Ethernet заголовок (уровень 2):

 Построить ethernet_header = Struct("ethernet_header",      MAC-адрес("пункт назначения"),      MAC-адрес("источник"),      Enum(UBInt16("тип"),          «IPv4»,  0x0800,          «ARP»,   0x0806,          «РАРП»,  0x8035,          «X25»,   0x0805,          «IPX»,   0x8137,          «IPv6»,  0x86DD,          "_дефолт_",  Проходят   ));

внешняя ссылка