注意:如果您想对项目进行更改,请不要分叉此存储库kaitai_struct 。相反,请在上面的文件树中选择要修改的组件,然后分叉该单个组件。
这是一个伞式存储库,仅包含作为子模块的组件,以便更轻松地检查整个项目。除非您想修改此自述文件,否则它不是您可以进行编辑的存储库。
Kaitai Struct是一种声明性语言,用于描述文件或内存中布置的各种二进制数据结构:即二进制文件格式、网络流数据包格式等。
主要思想是,特定格式仅用 Kaitai Struct 语言描述一次,然后可以使用ksc
将其编译为支持的编程语言之一的源文件。这些模块将包括为解析器生成的代码,该解析器可以从文件/流中读取所描述的数据结构,并通过一个漂亮、易于理解的 API 对其进行访问。
您是否曾经发现自己正在编写重复的、容易出错且难以调试的代码,这些代码从文件/网络流中读取二进制数据结构,并以某种方式将它们表示在内存中以便于访问?
Kaitai Struct 试图让这项工作变得更容易——你只需要描述一次二进制格式,然后每个人都可以通过他们的编程语言使用它——跨语言、跨平台。
Kaitai Struct 包含越来越多的格式描述集合,可在格式子模块存储库中找到。
当然。考虑这个简单的.ksy
格式描述文件,它描述了 GIF 文件(一种流行的 Web 图像格式)的标头:
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 字节 unsigned int这个.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
文件编译为目标语言源文件并将该文件包含在您的项目中查看教程和文档以获取更多信息。