---
# System prepended metadata

title: Kaitai Struct Inspector
tags: [kaitai]

---

# 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]"...
```
