Catatan: jika Anda ingin membuat perubahan pada proyek, jangan fork repositori ini kaitai_struct . Sebagai gantinya, pilih komponen yang ingin Anda modifikasi pada pohon file di atas dan bagi masing-masing komponen tersebut .
Ini adalah repositori payung, yang berisi komponen hanya sebagai submodul untuk memudahkan pemeriksaan keseluruhan proyek. Kecuali Anda ingin memodifikasi README ini, ini bukanlah repo tempat Anda dapat melakukan pengeditan.
Kaitai Struct adalah bahasa deklaratif yang digunakan untuk menggambarkan berbagai struktur data biner yang diletakkan dalam file atau memori: yaitu format file biner, format paket aliran jaringan, dll.
Ide utamanya adalah bahwa format tertentu dijelaskan dalam bahasa Kaitai Struct hanya sekali dan kemudian dapat dikompilasi dengan ksc
menjadi file sumber dalam salah satu bahasa pemrograman yang didukung. Modul-modul ini akan menyertakan kode yang dihasilkan untuk parser yang dapat membaca struktur data yang dijelaskan dari file/aliran dan memberikan akses ke sana dalam API yang bagus dan mudah dipahami.
Pernahkah Anda mendapati diri Anda menulis kode berulang, rawan kesalahan, dan sulit di-debug yang membaca struktur data biner dari aliran file/jaringan dan entah bagaimana merepresentasikannya dalam memori untuk akses yang lebih mudah?
Kaitai Struct mencoba membuat pekerjaan ini lebih mudah — Anda hanya perlu mendeskripsikan format biner satu kali dan kemudian semua orang dapat menggunakannya dari bahasa pemrograman mereka — lintas bahasa, lintas platform.
Kaitai Struct mencakup koleksi deskripsi format yang terus bertambah, tersedia dalam repositori submodul format.
Tentu. Pertimbangkan file deskripsi format .ksy
sederhana ini yang menjelaskan header file GIF (format gambar web populer):
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
Ini menyatakan bahwa file GIF biasanya memiliki ekstensi .gif
dan menggunakan pengkodean integer little-endian. File itu sendiri dimulai dengan dua blok: pertama muncul header
dan kemudian muncul logical_screen
:
87a
atau 89a
).image_width
dan image_height
adalah int 2-byte yang tidak ditandatanganiflags
, bg_color_index
dan pixel_aspect_ratio
masing-masing membutuhkan 1-byte unsigned int File .ksy
ini dapat dikompilasi menjadi Gif.cs
/ Gif.java
/ Gif.js
/ Gif.php
/ gif.py
/ gif.rb
dan kemudian secara instan seseorang dapat memuat file .gif dan mengaksesnya, misalnya lebar dan tinggi.
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 ());
Lihat catatan JavaScript di dokumentasi untuk panduan memulai cepat yang lebih lengkap.
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 } "
Tentu saja, contoh ini hanya menunjukkan sebagian kecil dari apa yang dapat dilakukan Kaitai Struct. Silakan merujuk ke tutorial dan dokumentasi untuk wawasan lebih lanjut.
Kompiler Resmi Kaitai Struct sekarang mendukung kompilasi .ksy
ke dalam modul sumber untuk bahasa berikut:
Cara termudah untuk memeriksa keseluruhan proyek Kaitai Struct adalah dengan mengunduh repositori proyek utama yang sudah mengimpor semua bagian lain sebagai submodul. Menggunakan:
git clone --recursive https://github.com/kaitai-io/kaitai_struct.git
Perhatikan opsi --recursive
.
Sebagai alternatif, seseorang dapat memeriksa masing-masing subproyek yang merupakan rangkaian Kaitai Struct. Mereka adalah:
.ksy
menjadi kode sumber parser yang ditulis dalam bahasa pemrograman target.ksy
Biasanya, menggunakan format yang dijelaskan dalam KS di proyek Anda, melibatkan langkah-langkah berikut:
.ksy
.ksy
ke dalam file sumber bahasa target dan sertakan file tersebut dalam proyek AndaLihat tutorial dan dokumentasi untuk informasi lebih lanjut.