ملحوظة: إذا كنت تريد إجراء تغييرات على المشروع، فلا تقم بتفرع هذا المستودع kaitai_struct . بدلاً من ذلك، اختر المكون الذي تريد تعديله في شجرة الملفات أعلاه وقم بتقسيم هذا المكون الفردي بدلاً من ذلك.
هذا مستودع شامل، يحتوي على المكونات فقط كوحدات فرعية لتسهيل التحقق من المشروع بأكمله. ما لم تكن ترغب في تعديل ملف README هذا، فهو ليس الريبو الذي يمكنك من خلاله إجراء التعديلات.
Kaitai Struct هي لغة تعريفية تستخدم لوصف هياكل البيانات الثنائية المختلفة الموضوعة في الملفات أو في الذاكرة: أي تنسيقات الملفات الثنائية، وتنسيقات حزم تدفق الشبكة، وما إلى ذلك.
الفكرة الرئيسية هي أن تنسيقًا معينًا يتم وصفه بلغة Kaitai Struct مرة واحدة فقط ومن ثم يمكن تجميعه باستخدام ملف ksc
في ملفات مصدر بإحدى لغات البرمجة المدعومة. ستتضمن هذه الوحدات رمزًا تم إنشاؤه لمحلل يمكنه قراءة بنية البيانات الموصوفة من ملف/دفق ومنح حق الوصول إليها في واجهة برمجة تطبيقات لطيفة وسهلة الفهم.
هل سبق لك أن وجدت نفسك تكتب تعليمات برمجية متكررة وعرضة للخطأ ويصعب تصحيحها والتي تقرأ هياكل البيانات الثنائية من تدفق الملفات/الشبكة وتمثلها بطريقة ما في الذاكرة لتسهيل الوصول إليها؟
يحاول Kaitai Struct تسهيل هذه المهمة - ما عليك سوى وصف التنسيق الثنائي مرة واحدة وبعد ذلك يمكن للجميع استخدامه من لغات البرمجة الخاصة بهم - عبر اللغات والأنظمة الأساسية.
يتضمن Kaitai Struct مجموعة متزايدة من أوصاف التنسيقات، المتوفرة في مستودع الوحدات الفرعية للتنسيقات.
بالتأكيد. خذ بعين الاعتبار ملف الوصف البسيط بتنسيق .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
عبارة عن ints غير موقعة بحجم 2 بايتflags
و bg_color_index
و pixel_aspect_ratio
بايت واحد غير موقع لكل منهما يمكن تجميع ملف .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
عادةً، يتضمن استخدام التنسيقات الموضحة في KS في مشروعك الخطوات التالية:
.ksy
.ksy
في ملف مصدر اللغة الهدف وقم بتضمين هذا الملف في مشروعكتحقق من البرنامج التعليمي والوثائق لمزيد من المعلومات.