注意:如果您想對專案進行更改,請不要分叉此儲存庫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
檔案編譯為目標語言原始檔並將該檔案包含在您的專案中查看教學和文件以獲取更多資訊。