Примечание: если вы хотите внести изменения в проект, не делайте форк этого репозитория kaitai_struct . Вместо этого выберите компонент, который вы хотите изменить, в дереве файлов выше и вместо этого создайте форк этого отдельного компонента.
Это зонтичный репозиторий, содержащий компоненты только в виде подмодулей, чтобы упростить проверку всего проекта. Если вы не хотите изменить этот README, это не репозиторий, в котором вы можете вносить изменения.
Kaitai Struct — это декларативный язык, используемый для описания различных структур двоичных данных, размещенных в файлах или в памяти: например, форматы двоичных файлов, форматы пакетов сетевых потоков и т. д.
Основная идея заключается в том, что конкретный формат описывается в языке Kaitai Struct только один раз, а затем может быть скомпилирован с помощью ksc
в исходные файлы на одном из поддерживаемых языков программирования. Эти модули будут включать в себя сгенерированный код для парсера, который сможет читать описанную структуру данных из файла/потока и предоставлять к ней доступ с помощью красивого, простого для понимания API.
Вы когда-нибудь писали повторяющийся, подверженный ошибкам и сложный для отладки код, который считывает двоичные структуры данных из файлового/сетевого потока и каким-то образом представляет их в памяти для облегчения доступа?
Kaitai Struct пытается облегчить эту работу — вам нужно всего лишь один раз описать двоичный формат, и тогда каждый сможет использовать его на своих языках программирования — кросс-языковом, кросс-платформенном.
Kaitai Struct включает в себя растущую коллекцию описаний форматов, доступных в репозитории подмодулей форматов.
Конечно. Рассмотрим этот простой файл описания формата .ksy
, описывающий заголовок файла GIF (популярного формата веб-изображений):
meta :
id : gif
file-extension : gif
endian : le
seq :
- id : header
type : header
- id : logical_screen
type : logical_screen
types :
header :
seq :
- id : magic
contents : ' GIF '
- id : version
size : 3
logical_screen :
seq :
- id : image_width
type : u2
- id : image_height
type : u2
- id : flags
type : u1
- id : bg_color_index
type : u1
- id : pixel_aspect_ratio
type : u1
Он заявляет, что файлы GIF обычно имеют расширение .gif
и используют целочисленную кодировку с прямым порядком байтов. Сам файл начинается с двух блоков: сначала идет header
, а затем logical_screen
:
87a
или 89a
).image_width
и image_height
— это 2-байтовые целые числа без знака.flags
, bg_color_index
и pixel_aspect_ratio
занимают по 1 байту беззнакового целого числа каждый Этот файл .ksy
можно скомпилировать в Gif.cs
/ Gif.java
/ Gif.js
/ Gif.php
/ gif.py
/ gif.rb
, а затем мгновенно можно загрузить файл .gif и получить доступ, например, к его ширине и высота.
Gif g = Gif . FromFile ( "path/to/some.gif" ) ;
Console . WriteLine ( "width = " + g . LogicalScreen . ImageWidth ) ;
Console . WriteLine ( "height = " + g . LogicalScreen . ImageHeight ) ;
Gif g = Gif . fromFile ( "path/to/some.gif" );
System . out . println ( "width = " + g . logicalScreen (). imageWidth ());
System . out . println ( "height = " + g . logicalScreen (). imageHeight ());
См. примечания по JavaScript в документации для более полного краткого руководства.
var g = new Gif ( new KaitaiStream ( someArrayBuffer ) ) ;
console . log ( "width = " + g . logicalScreen . imageWidth ) ;
console . log ( "height = " + g . logicalScreen . imageHeight ) ;
local g = Gif : from_file ( " path/to/some.gif " )
print ( " width = " .. g . logical_screen . image_width )
print ( " height = " .. g . logical_screen . image_height )
let g = Gif . fromFile ( " path/to/some.gif " )
echo " width = " & $ g.logicalScreen.imageWidth
echo " height = " & $ g.logicalScreen.imageHeight
$ g = Gif:: fromFile ( ' path/to/some.gif ' );
printf ( " width = %d n" , $ g -> logicalScreen ()-> imageWidth ());
printf ( " height = %d n" , $ g -> logicalScreen ()-> imageHeight ());
g = Gif . from_file ( "path/to/some.gif" )
print "width = %d" % ( g . logical_screen . image_width )
print "height = %d" % ( g . logical_screen . image_height )
g = Gif . from_file ( "path/to/some.gif" )
puts "width = #{ g . logical_screen . image_width } "
puts "height = #{ g . logical_screen . image_height } "
Конечно, этот пример показывает лишь очень ограниченную часть того, что может Kaitai Struct. Пожалуйста, обратитесь к руководствам и документации для получения дополнительной информации.
Официальный компилятор Kaitai Struct теперь поддерживает компиляцию .ksy
в исходные модули для следующих языков:
Самый простой способ проверить весь проект Kaitai Struct — загрузить основной репозиторий проекта, который уже импортирует все остальные части в виде подмодулей. Использовать:
git clone --recursive https://github.com/kaitai-io/kaitai_struct.git
Обратите внимание на опцию --recursive
.
Кроме того, можно просмотреть отдельные подпроекты, составляющие пакет Kaitai Struct. Они есть:
.ksy
в исходный код парсера, написанный на целевом языке программирования..ksy
Обычно использование форматов, описанных в KS, в вашем проекте включает в себя следующие шаги:
.ksy
.ksy
в исходный файл целевого языка и включите этот файл в свой проект.Ознакомьтесь с руководством и документацией для получения дополнительной информации.