# Kaitai Struct Inspector ###### tags: `kaitai` [TOC] --- Ссылка на GitHub: https://github.com/aleasims/kaitai-struct-python-inspector Инструмент **Kaitai Struct** предоставляет пользователю возможность автоматически генерировать код разборщика формата данных по декларативному описанию. При работе с языком *Python* в процессе генерации создается уникальный класс, сопоставляющийся описанному формату. Данный класс отвечает одновременно за разбор и представление результата разбора данных: методы класса осуществляют разбор данных, а поля класса после разбора соответствуют полям формата. Такое представление зачастую практично и удобно для пользователя, поскольку позволяет ему оперировать с объектом данного класса как с описанной структурой данных. Однако с точки зрения анализа разобранных данных такое представление может быть не удобно по ряду причин: * Атрибуты объекта, соответствующие полям формата, ничем не отличаются от встроенных и вспомогательных атрибутов этого же объекта. В частности имея объект класса формата нет возможности получить список всех его полей. Более того, в некоторых редких случаях возможен конфликт имен и затирание вспомогательных атрибутов класса значениями полей. * Отображение полей на исходное пространство данных не сохраняется: * Атрибуты, указывающие на смещение поля и его размер существуют только в `debug` режиме. * Возможно получение только интерпретированного значения для вершин со встроенным форматом. Получить буфер всех данных сложного поля невозможно. Для преодоления этих ограничений было разработано представление результата в виде дерева. Все форматы в данном представлении имеют класс узла (`Node`), от которого унаследованы разновидности узлов: `ValueNode`, `StructNode`, `ArrayNode` и т.д. Все узлы предоставляют следующие атрибуты: * `name` --- имя узла * `childs` --- список дочерних узлов в порядке спецификации * `parent` --- родительский узел * `raw_value` --- соответствующий байтовый отрезок * `start`, `end` --- адреса начала и конца узла * `value` --- интерпретированное значение (только для `ValueNode`) Для данного представления была реализована сериализация в форматы данных *Trawl* и *Dot*. Интерфейс инструмента принимает на входе описание формата в виде спецификации **Kaitai Struct** и файл с данными для разбора. На выходе он строит древовидное представление результата разбора и сериализует его в указанный формат. ![kspyspector-schema](https://i.imgur.com/RapSXSH.png) Пример работы инструмента: ``` $ kspyspector png.ksy example.png -o dot digraph {\n\t"Png(RootNode) [0-1156]" -> "magic(ValueNode<bytes>) [0-8]"... ```