Remarque : si vous souhaitez apporter des modifications au projet, ne forkez pas ce référentiel kaitai_struct . Au lieu de cela, choisissez le composant que vous souhaitez modifier dans l’arborescence de fichiers ci-dessus et dupliquez plutôt ce composant individuel.
Il s'agit d'un référentiel parapluie, contenant les composants uniquement sous forme de sous-modules pour faciliter l'extraction de l'ensemble du projet. Sauf si vous souhaitez modifier ce README, ce n'est pas le dépôt où vous pouvez apporter des modifications.
Kaitai Struct est un langage déclaratif utilisé pour décrire diverses structures de données binaires disposées dans des fichiers ou en mémoire : c'est-à-dire les formats de fichiers binaires, les formats de paquets de flux réseau, etc.
L'idée principale est qu'un format particulier n'est décrit qu'une seule fois dans le langage Kaitai Struct et peut ensuite être compilé avec un ksc
dans des fichiers source dans l'un des langages de programmation pris en charge. Ces modules incluront un code généré pour un analyseur capable de lire la structure de données décrite à partir d'un fichier/flux et d'y donner accès dans une API agréable et facile à comprendre.
Vous êtes-vous déjà retrouvé à écrire du code répétitif, sujet aux erreurs et difficile à déboguer, qui lit les structures de données binaires à partir d'un flux de fichiers/réseau et les représente d'une manière ou d'une autre en mémoire pour un accès plus facile ?
Kaitai Struct essaie de rendre ce travail plus facile : il suffit de décrire le format binaire une seule fois, puis tout le monde peut l'utiliser à partir de son langage de programmation – multilingue et multiplateforme.
Kaitai Struct comprend une collection croissante de descriptions de formats, disponibles dans le référentiel de sous-modules de formats.
Bien sûr. Considérez ce simple fichier de description au format .ksy
qui décrit l'en-tête d'un fichier GIF (un format d'image Web populaire) :
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
Il déclare que les fichiers GIF ont généralement une extension .gif
et utilisent un codage entier petit-boutiste. Le fichier lui-même commence par deux blocs : vient d' header
, puis vient logical_screen
:
87a
ou 89a
).image_width
et image_height
sont des entiers non signés de 2 octetsflags
, bg_color_index
et pixel_aspect_ratio
prennent chacun un entier non signé de 1 octet Ce fichier .ksy
peut être compilé dans Gif.cs
/ Gif.java
/ Gif.js
/ Gif.php
/ gif.py
/ gif.rb
puis instantanément on peut charger le fichier .gif et accéder, par exemple, à sa largeur et hauteur.
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 ());
Consultez les notes JavaScript dans la documentation pour un guide de démarrage rapide plus complet.
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 } "
Bien entendu, cet exemple ne montre qu’un sous-ensemble très limité de ce que Kaitai Struct peut faire. Veuillez vous référer aux didacticiels et à la documentation pour plus d'informations.
Le compilateur officiel Kaitai Struct prend désormais en charge la compilation .ksy
dans des modules source pour les langages suivants :
Le moyen le plus simple de consulter l'ensemble du projet Kaitai Struct est de télécharger le référentiel principal du projet qui importe déjà toutes les autres parties en tant que sous-modules. Utiliser:
git clone --recursive https://github.com/kaitai-io/kaitai_struct.git
Notez l'option --recursive
.
Alternativement, on peut consulter des sous-projets individuels qui constituent la suite Kaitai Struct. Ils sont:
.ksy
en un code source d'analyseur écrit dans un langage de programmation cible.ksy
En règle générale, l'utilisation des formats décrits dans KS dans votre projet implique les étapes suivantes :
.ksy
.ksy
dans le fichier source de la langue cible et incluez ce fichier dans votre projetConsultez le didacticiel et la documentation pour plus d'informations.