Nota: se você quiser fazer alterações no projeto, não bifurque este repositório kaitai_struct . Em vez disso, escolha o componente que deseja modificar na árvore de arquivos acima e bifurque esse componente individual.
Este é um repositório guarda-chuva, contendo os componentes apenas como submódulos para facilitar o check-out de todo o projeto. A menos que você queira modificar este README, não é o repositório onde você pode fazer edições.
Kaitai Struct é uma linguagem declarativa usada para descrever várias estruturas de dados binários dispostas em arquivos ou na memória: ou seja, formatos de arquivos binários, formatos de pacotes de fluxo de rede, etc.
A ideia principal é que um formato específico seja descrito na linguagem Kaitai Struct apenas uma vez e então possa ser compilado com um ksc
em arquivos de origem em uma das linguagens de programação suportadas. Esses módulos incluirão um código gerado para um analisador que pode ler a estrutura de dados descrita de um arquivo/stream e dar acesso a ela em uma API agradável e fácil de compreender.
Você já se viu escrevendo código repetitivo, sujeito a erros e difícil de depurar, que lê estruturas de dados binários de fluxo de arquivo/rede e de alguma forma os representa na memória para facilitar o acesso?
Kaitai Struct tenta tornar esse trabalho mais fácil - você só precisa descrever o formato binário uma vez e então todos poderão usá-lo em suas linguagens de programação - entre linguagens e plataformas.
Kaitai Struct inclui uma coleção crescente de descrições de formato, disponíveis no repositório de submódulos de formatos.
Claro. Considere este arquivo de descrição de formato .ksy
simples que descreve o cabeçalho de um arquivo GIF (um formato popular de imagem da 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
Ele declara que os arquivos GIF geralmente têm uma extensão .gif
e usam codificação inteira little-endian. O arquivo em si começa com dois blocos: primeiro vem header
e depois vem logical_screen
:
87a
ou 89a
).image_width
e image_height
são inteiros não assinados de 2 bytesflags
, bg_color_index
e pixel_aspect_ratio
levam 1 byte unsigned int cada Este arquivo .ksy
pode ser compilado em Gif.cs
/ Gif.java
/ Gif.js
/ Gif.php
/ gif.py
/ gif.rb
e então instantaneamente pode-se carregar o arquivo .gif e acessar, por exemplo, sua largura e 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 as notas sobre JavaScript na documentação para obter um guia de início rápido mais completo.
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 } "
É claro que este exemplo mostra apenas um subconjunto muito limitado do que o Kaitai Struct pode fazer. Consulte os tutoriais e a documentação para obter mais informações.
O compilador oficial Kaitai Struct agora suporta a compilação .ksy
em módulos de origem para os seguintes idiomas:
A maneira mais fácil de verificar todo o projeto Kaitai Struct é baixar o repositório principal do projeto que já importa todas as outras partes como submódulos. Usar:
git clone --recursive https://github.com/kaitai-io/kaitai_struct.git
Observe a opção --recursive
.
Alternativamente, pode-se verificar subprojetos individuais que constituem o pacote Kaitai Struct. Eles são:
.ksy
em um código-fonte do analisador escrito em uma linguagem de programação alvo.ksy
Normalmente, usar os formatos descritos no KS em seu projeto envolve as seguintes etapas:
.ksy
.ksy
no arquivo de origem do idioma de destino e inclua esse arquivo em seu projetoConfira o tutorial e a documentação para obter mais informações.