The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Выпуск языка описания бинарных форматов Kaitai Struct 0.9

19.10.2020 09:09

Представлен новый выпуск Kaitai Struct 0.9, декларативного языка разметки для описания различных бинарных структур данных — бинарных форматов файлов, архивов, сетевых пакетов, файловых систем, изображений, видео и т.п. Код компилятора Kaitai Struct распространяется под лицензией GPLv3, а библиотек под лицензиями MIT и Apache 2.0.

Основная идея проекта в том, что конкретный формат может быть описан на языке Kaitai Struct и затем транспилирован при помощи kaitai-struct-compiler в исходный текст на одном из поддерживаемых языков программирования (C++, C#, Java, JavaScript, Perl, PHP, Python, Ruby, Go, Nim). Сформированные модули будут включать сгенерированный код для парсера, который может читать описанную структуру данных из файла и предоставлять доступ к содержимому в форме удобного API. Проектом также развивается IDE для визуального исследования файлов.

В новой версия добавлена поддержка целевого языка C++11 (с умными указателями). Реализовано несколько новых функций, таких как валидация и обработка структур поверх little-endian чисел. Структуры поверх чисел, известные как "bit-sized types" в местной терминологии - это когда поле занимает нецелое число байт. Это было и раньше, но только для big-endian. Для little-endian это делалось полностью вручную: программист должен был самостоятельно переотобразить позиции битов в little-endian числе в big-endian число, если поле переходит границы байтов - порезать и склеить.

Сейчас это частично автоматизировано, но не через прослойку для переотображение бит и обобщение endianness, при этом сохраняя прежний ("be") порядок перечисления полей в структуре. Новый ведущий разработчик Petr Pucil решил, что для little-endian хорошо бы перечислять поля тоже в little-endian порядке, что приводит как минимум к тому, что при описании "bit-sized types" в форматах, которые могут иметь как "be", так и "le" endianness, приходится в явном виде иметь по 2 варианта одной и той же структуры]).

Главные новшества релиза:

  • Поддержка новых целей:
    • Python с библиотекой Construct.
    • HTML - для документации, предварительная поддержка.
    • Nim - начальный уровень поддержки (проходит 51% тестов).
  • Новые возможности языка Kaitai Struct:
    • doc-ref поддерживает список ссылок.
    • "meta/tags" позволяют специфицировать несколько тегов для улучшения навигации в галерее форматов.
    • Разрешён доступ ко вложенным типам используя синтаксис "foo::bar".
    • Реализована валидация распарсенных данных, используя ключ "valid".
    • Реализованы вычисляемые во время компиляции операторы "sizeof" и "bitsizeof". Для типа: "sizeof<u4>", "bitsizeof<b13>", "sizeof<user_type>". Для значения: "file_header._sizeof", "flags._bitsizeof" (где "file_header" и "flags" - поля, определённые в текущем типе).
    • Реализована поддержка little-endian типов с полями с размером в нецелое число байт. Выбор endianness осуществляется через суффикс le/be: "type: b12le", "type: b1be". Для выбора битовой endianness (le/be) по умолчанию добавлен ключ "meta/bit-endian".
  • Язык выражений:
  • Общие улучшения компиляции:
    • Поддержка деревьев директорий, похожих на Maven, путём недобавления более поддиректории "src" для результатов Go и Java. Хотя изменение с большей вероятностью ломает существующие построения, оно уравнивает языки Go и Java с другими. Кроме того, добавление поддиректорий проще для пользователя, чем удаление некоторых добавленных Kaitai автоматически.
    • Улучшенные сообщения об ошибках.
    • Поддержка .ksy файлов с UTF-8 BOM.
    • Сообщения об ошибках отправляются в stderr, а не в stdout.
    • Режим "--debug" разделён на "--no-auto-read" и "--read-pos".
    • Добавлен режим C++11, включаемый через опцию "--cpp-standard 11" (98 по умолчанию).
    • C++11 цель: поддерживает литералы массивов, использует "#pragma once" (вместо "#ifndef FOO_H_" header guards) и "std::unique_ptrЬ<foo> для владеющих указателей, сырые указатели "foo*" для не владеющих.
    • Для C++11 реализован режим "--no-auto-read" и добавлена поддержка Windows и Visual C++.
    • Преобразования регистра избавлены от зависимости от локали.
  • Изменения в API времени выполнения:
    • Добавлены исключения "Validation{Not{Equal,AnyOf},{Less,Greater}Than,Expr}Error" наследующие от общего предка "ValidationFailedError" - генерируются на проваленных валидациях, определённых через ключи "valid" или "contents".
    • Добавлен метод "read_bits_int_le" для парсинга little-endian целых с размером в битах.
    • Создана официальная библиотека алгоритмов сжатия для использования в "process" и внесены изменения в компилятор, чтобы позволить использовать "process" не в runtime.
    • Не рекомендованы классы и методы:
      • ensure_fixed_contents ⟶ явный "if", который проверяет равенство "readBytes(n)", ожидаемому массиву из "n" байт (генерируя "ValidationNotEqualError" при неудаче)
      • UnexpectedDataError ⟶ ValidationNotEqualError
      • read_bits_int ⟶ read_bits_int_be
  • Значительные исправления:
    • "params/type" - добавлена поддержка:
      • пользовательских типов
      • enum
      • массивов байт ("bytes")
      • массивов не-байт ("u2[]", "struct[]" и т.п.)
    • В условном операторе ("? :") и литерале массива исправлено приведение разных типов строк/массивов байт/перечислений/булевых (распарсенных из потока и созданных из литерала).
    • Подстрока "not" не может быть использована в выражениях.
    • Целые с размером в битах не учитывались как надо в "repeat: eos".
    • Исправлен выбор с одним лишь значением по умолчанию ("_: foo").
    • C++: поправили все известные утечки памяти (но всё равно в некоторых случаях потребление слишком большое).
    • C++: исправили абсолютные импорты.
    • Java: более последовательное закрытие нижележащих IO потоков на вынужденном "close()".
    • Python: обход генерации циклических зависимостей.
    • PHP: правка невалидных объявлений "namespace", когда "--php-namespace" не указан.
  • Разное:
    • Компилятор Kaitai Struct доступен в форме плагина к Maven и Gradle.
    • Нестабильные бинарные сборки теперь доступны для всех платформ после каждой сборки CI на Bintray Bintray.
    • Справочник по языку KS заменён документацией, генерируемой из JSONSchema.
    • Содержимое formats.kaitai.io теперь перестраивается автоматически с помощью CI/CD.
    • Новая модульная CI/CD-система для компилятора, параллельно работающая на многих разных ОС (Linux, Windows, macOS) и показывающая статус на сайте ci.kaitai.io.
    • Обеспечена генерация тестов из KST-спецификаций, одних и тех же для всех языков.
    • Создан список проектов awesome, относящихся к Kaitai Struct.
    • Появились альтернативные компиляторы KSC, специфичные для целевых языков и нацеленные на упрощение интеграции KS в сборочные инструментарии: ksc-rs для Rust, kaitaigo для Go и nimitai для nim.


  1. Главная ссылка к новости (https://kaitai.io/news/2020/10...)
  2. OpenNews: Выпуск языка описания бинарных форматов Kaitai Struct 0.7
  3. OpenNews: Декларативная спецификация парсинга бинарных файлов Kaitai Struct
  4. OpenNews: Google опубликовал протокол обмена данными "Protocol Buffers"
  5. OpenNews: Компания Google открыла код gRPC, RPC-фреймворка на основе HTTP/2
  6. OpenNews: Компания Valve открыла реализацию системы TCP-подобных коммуникаций поверх UDP
Автор новости: Аноним
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/53912-kaitai
Ключевые слова: kaitai
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (36) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, uis (ok), 10:01, 19/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Интересный проект. Тыкал кто?
     
     
  • 2.2, EndrII (?), 10:03, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • –15 +/
    дно, мне не зашло
     
     
  • 3.23, JL2001 (ok), 15:00, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > дно, мне не зашло

    больше подробностей в студию

     
  • 2.3, Анан (?), 10:05, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +5 +/
    использовал для распаковки архива ресурсов от игры, нормально
     
     
  • 3.6, uis (ok), 10:14, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Реверсил формат?
     
  • 3.12, anonymous (??), 10:48, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Kaitai может только распаковку, обратную упаковку не умеет, для меня это была критическая проблема. Использую Construct, у которого нет проблем с сериализацией/десериализацией.
     
     
  • 4.21, Аноним (21), 14:22, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    А что за Construct?
     
     
  • 5.27, Аноним (27), 22:35, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Прямо в тексте новости же написано:

    >Поддержка новых целей:
    >    Python с библиотекой Construct.

     
  • 3.15, Lex (??), 10:50, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • –3 +/
    для этого же есть штуки вроде Dragon Unpacker..
     
     
  • 4.24, JL2001 (ok), 15:03, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > для этого же есть штуки вроде Dragon Unpacker..

    ipf (от tos) мне распакует?

     
  • 4.25, JL2001 (ok), 15:05, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > для этого же есть штуки вроде Dragon Unpacker..

    grf от ragnarok понимает? и формат моделей карт?

     

  • 1.4, Аноним (4), 10:07, 19/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Чем лучше/хуже protobuf?
     
     
  • 2.5, Аноним (5), 10:10, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +4 +/
    теплое vs мягкое
     
     
  • 3.7, Аноним (4), 10:20, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Объясните, для тупых, плз. А то я и там и там вижу свой ЯП для задания структур данных, сериализацию и т.п.
     
     
  • 4.8, Аноним (5), 10:25, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    в протобуфе фиксированный стандартный формат (пусть и в каждой версии свой). сабж - позволяет описать любой формат (собственно, для этого он и сделан)
     
  • 4.9, Аноним (5), 10:26, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    тогда и надо спрашивать про разницу, а не "хуже" "лучше"
     
  • 4.11, Аноним (27), 10:43, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +19 +/
    Protocol Buffers - для обмена сообщениями между программами с экономией места на сериализации и версионированием API.
    Kaitai Struct - это когда тебе в твоём языке позарез нужно распарсить какой-то формат, а готовой библиотеки нет. Можно долго нудно вручную писать и отлаживать парсер. А можно взять и специфицировать его на Kaitai Struct. После этого компилятор парсер сгенерирует сам. Потом ты решишь, что питон оказался слишком медленным и что надо переписать на rust. Парсер тебе переписывать не придётся - просто перетранспилируешь на раст.

    А ещё у нас есть библиотека готовых форматов, так что в некоторых случаях и писать спеку не придётся.

     
     
  • 5.13, Lex (??), 10:49, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Ответ норм, но ИМХО, что-то более-менее серьезное( особенно когда речь о данных, которые могут быть либо битыми, либо - заведомо-некорректно сформированными, т.е практически любые, приходящие со стороны пользователя ) этой штукой рискованно генерировать.
    Такого нагенерирует, что на написание всевозможных тестов и проч, скорее всего, не меньше времени уйдет, чем на написание норм парсера.
     
     
  • 6.18, Аноним (27), 11:14, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Это как раз одно из достоинств - с битыми форматами эта штука справляется автоматически. Человек может забыть написать проверку, а тут проверки встроены в рантайм. Правда есть у kaitai ии минусы
    1. теряется производительность
    2. жор памяти
    3. раскладка структур по сырой памяти (такой как отображённый в память файл) пока не реализована
    4. опасаюсь целочисленных переполнений. Правда в написанных руками парсерах тоже редко где такое проверяется.
     
  • 6.22, Аноним (21), 14:24, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Такого нагенерирует, что на написание всевозможных тестов и проч, скорее всего, не меньше времени уйдет, чем на написание норм парсера.
    >> Обеспечена генерация тестов из KST-спецификаций, одних и тех же для всех языков.
     
  • 5.14, Аноним (4), 10:49, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Спасибо за развёрнутый ответ.
     
  • 2.10, Аноним (10), 10:31, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вообще разные назначения же.
     

  • 1.16, Аноним (16), 11:01, 19/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Мне почему то захотелось написать свой велосипед на тему проекта
     
  • 1.17, nomad__ (ok), 11:05, 19/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Интересно, интересно... Сайт проекта - в закладки, авось пригодится когда.
     
  • 1.19, Аноним (19), 12:05, 19/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Катай Структуры
     
     
  • 2.34, Аноним (34), 19:48, 20/10/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Катай структуры не отходя от кассы!
     

  • 1.20, Иваня (?), 13:58, 19/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Чот забыл про него, когда-то добавил его в закладки, над попробовать, спасиб, что напомнили
     
  • 1.26, Lemko (?), 19:09, 19/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Может у Вас у библиотеке форматов modbus есть. Был бы примного благодарен.
     
     
  • 2.28, Аноним (27), 22:50, 19/10/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Нет у нас в библиотеке. Но в инете есть пост в блоге, что у кого-то есть. Свяжись с ними и попроси поделиться спекой.
     

  • 1.29, Аноним (29), 06:39, 20/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Недавно использовал его, и как раз думал, что что-то давно о нём не было новостей на опеннете. Продолжайте, успехов вам.
     
  • 1.30, Додо (?), 07:56, 20/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Отличная штука для парсинга файлов. Есть куча готовых описаний форматов.
    Из минусов:
    - сложно читать код формата, если он довольно объемный (модульность какую-то прикрутили бы, что ли? хотя пользовался давно, может уже и есть, не в курсе);
    - описания местами получаются избыточными, но это минус небольшой и зависит от формата файла.
    По поводу того, что он не умеет в сериализацию, так она не всегда и нужна.
     
     
  • 2.31, Аноним (27), 10:08, 20/10/2020 [^] [^^] [^^^] [ответить]  
  • +/
    >модульность какую-то прикрутили бы, что ли? хотя пользовался давно, может уже и есть, не в курсе);

    Есть модульность.

     

  • 1.32, мяя (?), 13:32, 20/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Далеко там в планах обратная запаковка?
     
     
  • 2.33, Аноним (33), 18:43, 20/10/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Самый важный вопрос!
     
  • 2.35, Аноним (27), 23:43, 20/10/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Пока не напишешь - не будет. Некие зачатки уже есть, для полноценной реализации нужен символический решатель на основе SMT-решателя. Читай соответствующyю issue. Без питона это вряд ли будет, потому что Scala - это ужас-ужас-ужас.
     

  • 1.36, Аноним (36), 15:43, 28/02/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А дельфи-паскаль структуру данных можно им разобрать?
     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру