Nota: si desea realizar cambios en el proyecto, no bifurque este repositorio kaitai_struct . En su lugar, elija el componente que desea modificar en el árbol de archivos de arriba y bifurque ese componente individual.
Este es un repositorio general que contiene los componentes solo como submódulos para que sea más fácil revisar todo el proyecto. A menos que desee modificar este archivo README, no es el repositorio donde puede realizar modificaciones.
Kaitai Struct es un lenguaje declarativo utilizado para describir varias estructuras de datos binarios dispuestas en archivos o en la memoria: es decir, formatos de archivos binarios, formatos de paquetes de flujo de red, etc.
La idea principal es que un formato particular se describe en el lenguaje Kaitai Struct solo una vez y luego se puede compilar con un ksc
en archivos fuente en uno de los lenguajes de programación compatibles. Estos módulos incluirán un código generado para un analizador que puede leer la estructura de datos descrita de un archivo/transmisión y brindar acceso a ella en una API agradable y fácil de comprender.
¿Alguna vez se ha encontrado escribiendo código repetitivo, propenso a errores y difícil de depurar que lee estructuras de datos binarios de archivos/flujos de red y de alguna manera los representa en la memoria para facilitar el acceso?
Kaitai Struct intenta hacer este trabajo más fácil: solo tienes que describir el formato binario una vez y luego todos podrán usarlo desde sus lenguajes de programación, en varios idiomas y en varias plataformas.
Kaitai Struct incluye una colección cada vez mayor de descripciones de formatos, disponibles en el repositorio del submódulo de formatos.
Seguro. Considere este sencillo archivo de descripción en formato .ksy
que describe el encabezado de un archivo GIF (un formato de imagen web popular):
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
Declara que los archivos GIF suelen tener una extensión .gif
y utilizan codificación entera little-endian. El archivo en sí comienza con dos bloques: primero viene header
y luego viene logical_screen
:
87a
o 89a
).image_width
e image_height
son entradas sin signo de 2 bytesflags
, bg_color_index
y pixel_aspect_ratio
toman 1 byte int sin signo cada uno Este archivo .ksy
se puede compilar en Gif.cs
/ Gif.java
/ Gif.js
/ Gif.php
/ gif.py
/ gif.rb
y luego instantáneamente se puede cargar el archivo .gif y acceder, por ejemplo, a su ancho y altura.
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 ());
Consulte las notas de JavaScript en la documentación para obtener una guía de inicio rápido más completa.
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 } "
Por supuesto, este ejemplo muestra sólo un subconjunto muy limitado de lo que Kaitai Struct puede hacer. Consulte los tutoriales y la documentación para obtener más información.
El compilador oficial Kaitai Struct ahora admite la compilación de .ksy
en módulos fuente para los siguientes idiomas:
La forma más sencilla de comprobar todo el proyecto Kaitai Struct es descargar el repositorio principal del proyecto que ya importa todas las demás partes como submódulos. Usar:
git clone --recursive https://github.com/kaitai-io/kaitai_struct.git
Tenga en cuenta la opción --recursive
.
Alternativamente, se pueden consultar los subproyectos individuales que constituyen la suite Kaitai Struct. Ellos son:
.ksy
a un código fuente de analizador escrito en un lenguaje de programación de destino.ksy
Normalmente, utilizar los formatos descritos en KS en su proyecto implica los siguientes pasos:
.ksy
.ksy
en el archivo fuente del idioma de destino e incluya ese archivo en su proyectoConsulte el tutorial y la documentación para obtener más información.