# 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 png.ksy example.png -o dot
digraph {\n\t"Png(RootNode) [0-1156]" -> "magic(ValueNode<bytes>) [0-8]"...
```