หมายเหตุ: หากคุณต้องการเปลี่ยนแปลงโปรเจ็กต์ อย่า แยกพื้นที่เก็บข้อมูลนี้ kaitai_struct ให้เลือกส่วนประกอบที่คุณต้องการแก้ไขในแผนผังไฟล์ด้านบนและแยกส่วนประกอบ นั้น แทน
นี่คือพื้นที่เก็บข้อมูลหลักที่มีส่วนประกอบเป็นโมดูลย่อยเท่านั้นเพื่อให้ง่ายต่อการตรวจสอบโปรเจ็กต์ทั้งหมด เว้นแต่ว่าคุณต้องการแก้ไข README นี้ คุณจะไม่สามารถแก้ไข repo ได้
Kaitai Struct เป็นภาษาประกาศที่ใช้สำหรับอธิบายโครงสร้างข้อมูลไบนารีต่างๆ ที่วางอยู่ในไฟล์หรือในหน่วยความจำ เช่น รูปแบบไฟล์ไบนารี รูปแบบแพ็กเก็ตสตรีมเครือข่าย ฯลฯ
แนวคิดหลักคือรูปแบบเฉพาะมีการอธิบายในภาษา Kaitai Struct เพียงครั้งเดียว จากนั้นจึงสามารถคอมไพล์ด้วย ksc
ลงในไฟล์ต้นฉบับในภาษาโปรแกรมที่รองรับภาษาใดภาษาหนึ่งได้ โมดูลเหล่านี้จะรวมโค้ดที่สร้างขึ้นสำหรับ parser ที่สามารถอ่านโครงสร้างข้อมูลที่อธิบายจากไฟล์ / สตรีม และให้สิทธิ์การเข้าถึงใน API ที่ดีและเข้าใจง่าย
คุณเคยพบว่าตัวเองกำลังเขียนโค้ดซ้ำๆ มีโอกาสเกิดข้อผิดพลาดได้ง่าย และแก้ไขยาก ซึ่งอ่านโครงสร้างข้อมูลไบนารีจากไฟล์/สตรีมเครือข่าย และแสดงข้อมูลเหล่านั้นในหน่วยความจำเพื่อให้เข้าถึงได้ง่ายขึ้นหรือไม่
Kaitai Struct พยายามทำให้งานนี้ง่ายขึ้น คุณเพียงแค่ต้องอธิบายรูปแบบไบนารี่เพียงครั้งเดียว จากนั้นทุกคนจะสามารถใช้งานได้จากภาษาการเขียนโปรแกรมของพวกเขา ข้ามภาษา ข้ามแพลตฟอร์ม
Kaitai Struct มีคอลเลกชันคำอธิบายรูปแบบที่เพิ่มมากขึ้น ซึ่งมีให้เลือกใช้ในรูปแบบ submodule repository
แน่นอน. ลองพิจารณาไฟล์คำอธิบายรูปแบบ .ksy
ง่ายๆ นี้ ซึ่งอธิบายส่วนหัวของไฟล์ GIF (รูปแบบรูปภาพบนเว็บยอดนิยม):
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
โดยประกาศว่าไฟล์ GIF มักจะมีนามสกุล .gif
และใช้การเข้ารหัสจำนวนเต็มจำนวนน้อย ตัวไฟล์นั้นเริ่มต้นด้วยสองบล็อก: อันดับแรกมา header
แล้วมา logical_screen
:
87a
หรือ 89a
)image_width
และ image_height
เป็น int ที่ไม่ได้ลงนามขนาด 2 ไบต์flags
, bg_color_index
และ pixel_aspect_ratio
ใช้ int ที่ไม่ได้ลงนามขนาด 1 ไบต์ ไฟล์ .ksy
นี้สามารถคอมไพล์เป็น Gif.cs
/ Gif.java
/ Gif.js
/ Gif.php
/ gif.py
/ gif.rb
จากนั้นก็สามารถโหลดไฟล์ .gif และเข้าถึงได้ทันที เช่น ความกว้างและ ความสูง.
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 ());
ดูหมายเหตุ JavaScript ในเอกสารประกอบสำหรับคู่มือเริ่มต้นใช้งานฉบับย่อที่สมบูรณ์ยิ่งขึ้น
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 } "
แน่นอนว่า ตัวอย่างนี้แสดงเฉพาะชุดย่อยที่จำกัดมากของสิ่งที่ Kaitai Struct สามารถทำได้ โปรดดูบทช่วยสอนและเอกสารประกอบสำหรับข้อมูลเชิงลึกเพิ่มเติม
คอมไพเลอร์ Kaitai Struct อย่างเป็นทางการรองรับการคอมไพล์ .ksy
ลงในโมดูลซอร์สสำหรับภาษาต่อไปนี้:
วิธีที่ง่ายที่สุดในการตรวจสอบโครงการ Kaitai Struct ทั้งหมดคือการดาวน์โหลดพื้นที่เก็บข้อมูลโครงการหลักที่นำเข้าส่วนอื่นๆ ทั้งหมดเป็นโมดูลย่อยแล้ว ใช้:
git clone --recursive https://github.com/kaitai-io/kaitai_struct.git
หมายเหตุตัวเลือก --recursive
อีกทางหนึ่ง สามารถตรวจสอบโครงการย่อยแต่ละโครงการที่ประกอบเป็นชุด Kaitai Struct ได้ พวกเขาคือ:
.ksy
ksy เป็นซอร์สโค้ด parser ที่เขียนด้วยภาษาโปรแกรมเป้าหมาย.ksy
โดยทั่วไป การใช้รูปแบบที่อธิบายไว้ใน KS ในโครงการของคุณเกี่ยวข้องกับขั้นตอนต่อไปนี้:
.ksy
.ksy
ลงในไฟล์ต้นฉบับภาษาเป้าหมายและรวมไฟล์นั้นไว้ในโปรเจ็กต์ของคุณตรวจสอบบทช่วยสอนและเอกสารประกอบสำหรับข้อมูลเพิ่มเติม