Hinweis: Wenn Sie Änderungen am Projekt vornehmen möchten, teilen Sie dieses Repository nicht mit kaitai_struct auf. Wählen Sie stattdessen im Dateibaum oben die Komponente aus, die Sie ändern möchten, und verzweigen Sie stattdessen diese einzelne Komponente.
Hierbei handelt es sich um ein übergeordnetes Repository, das die Komponenten nur als Untermodule enthält, um das Auschecken des gesamten Projekts zu erleichtern. Sofern Sie diese README-Datei nicht ändern möchten, handelt es sich nicht um das Repo, in dem Sie Änderungen vornehmen können.
Kaitai Struct ist eine deklarative Sprache, die zur Beschreibung verschiedener binärer Datenstrukturen in Dateien oder im Speicher verwendet wird: z. B. binäre Dateiformate, Netzwerk-Stream-Paketformate usw.
Die Grundidee besteht darin, dass ein bestimmtes Format nur einmal in der Sprache Kaitai Struct beschrieben wird und dann mit einem ksc
in Quelldateien in einer der unterstützten Programmiersprachen kompiliert werden kann. Diese Module enthalten einen generierten Code für einen Parser, der die beschriebene Datenstruktur aus einer Datei/einem Stream lesen und über eine schöne, leicht verständliche API Zugriff darauf gewähren kann.
Haben Sie sich jemals dabei ertappt, sich wiederholenden, fehleranfälligen und schwer zu debuggenden Code zu schreiben, der binäre Datenstrukturen aus Datei-/Netzwerkströmen liest und sie für einen einfacheren Zugriff irgendwie im Speicher darstellt?
Kaitai Struct versucht, diese Arbeit zu erleichtern – Sie müssen das Binärformat nur einmal beschreiben und dann kann es jeder in seinen Programmiersprachen verwenden – sprachübergreifend, plattformübergreifend.
Kaitai Struct enthält eine wachsende Sammlung von Formatbeschreibungen, die im Format-Submodul-Repository verfügbar sind.
Sicher. Betrachten Sie diese einfache Beschreibungsdatei im .ksy
-Format, die den Header einer GIF-Datei (ein beliebtes Webbildformat) beschreibt:
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
Darin wird erklärt, dass GIF-Dateien normalerweise die Erweiterung .gif
haben und Little-Endian-Integer-Kodierung verwenden. Die Datei selbst beginnt mit zwei Blöcken: Zuerst kommt header
und dann logical_screen
:
87a
oder 89a
) identifizieren.image_width
und image_height
sind 2-Byte-Ints ohne Vorzeichenflags
, bg_color_index
und pixel_aspect_ratio
nehmen jeweils 1-Byte-Int ohne Vorzeichen an Diese .ksy
Datei kann in Gif.cs
/ Gif.java
/ Gif.js
/ Gif.php
/ gif.py
/ gif.rb
kompiliert werden und dann kann man sofort die .gif-Datei laden und beispielsweise auf deren Breite und Breite zugreifen Höhe.
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 ());
Eine ausführlichere Kurzanleitung finden Sie in den JavaScript-Hinweisen in der Dokumentation.
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 } "
Natürlich zeigt dieses Beispiel nur einen sehr begrenzten Teil dessen, was Kaitai Struct leisten kann. Weitere Einblicke finden Sie in den Tutorials und der Dokumentation.
Der offizielle Kaitai Struct-Compiler unterstützt jetzt das Kompilieren von .ksy
in Quellmodule für die folgenden Sprachen:
Der einfachste Weg, das gesamte Kaitai Struct-Projekt auszuprobieren, besteht darin, das Hauptprojekt-Repository herunterzuladen, das bereits alle anderen Teile als Untermodule importiert. Verwenden:
git clone --recursive https://github.com/kaitai-io/kaitai_struct.git
Beachten Sie die Option --recursive
.
Alternativ kann man sich einzelne Teilprojekte ansehen, die die Kaitai Struct Suite bilden. Sie sind:
.ksy
in einen Parser-Quellcode übersetzt, der in einer Zielprogrammiersprache geschrieben ist.ksy
Dateien bezeichnet werden Normalerweise umfasst die Verwendung der in KS beschriebenen Formate in Ihrem Projekt die folgenden Schritte:
.ksy
Datei.ksy
Datei in die Quelldatei der Zielsprache und fügen Sie diese Datei in Ihr Projekt einWeitere Informationen finden Sie im Tutorial und in der Dokumentation.