Meine ersten Schritte in Kaitai Struct, ich habe versucht, BSON-Parser als Übung zu tun. Mein .ksy Code, der jetzt BSON Element parst sieht wie folgt aus:Analysieren Opcodes mit Kaitai Struct
element:
seq:
- id: el_type
type: u1
enum: bson_type
- id: el_name
type: strz
encoding: UTF-8
if: el_type != bson_type::end_of_document
- id: el_string
type: bson_string
if: el_type == bson_type::string
- id: el_document
type: bson_document
if: el_type == bson_type::document
- id: el_boolean
type: u1
if: el_type == bson_type::boolean
- id: el_int32
type: s4
if: el_type == bson_type::int32
- id: el_int64
type: s4
if: el_type == bson_type::int64
enums:
bson_type:
0: end_of_document
1: double
2: string
3: document
8: boolean
0x10: int32
0x12: int64
Wie Sie vielleicht bemerkt haben, gibt es viele Wiederholungen. Man muss einfach gehen duplizieren if
Block jedes Mal, wenn Sie zusätzliche Elementtyp möchten. Schlimmer noch, Sie müssen das Zeug dreimal in jedem dieser Felder duplizieren, z. B .:
- id: el_string # <= string!
type: bson_string # <= string!
if: el_type == bson_type::string # <= string!
Meine Zielsprache ist Java. Vor Kaitai, habe ich versucht, nur Preon, und dort hatten wir Klauseln wie:
@Choices(prefixSize = 8, alternatives = {
@Choice(condition = "prefix==0x01", type = FloatNamedElement.class),
@Choice(condition = "prefix==0x02", type = UTF8NamedElement.class)
}
private NamedElement elements;
Es automatisch Sie diese beiden Elemente erhalten basierend auf dem Wert von „prefix“. Ist es möglich, es in Kaitai zu tun?
Interessanterweise ist Preon alles andere als begrenzt, es sei denn, Sie denken über die Codecs nach, die standardmäßig ausgeliefert werden. Erweiterbarkeit ist einer der Hauptgründe, warum Preon erstellt wurde, da keines der vorhandenen Frameworks erweiterbar genug war, um allen Anwendungsfällen, in die wir hineingeraten waren, gerecht zu werden. Welches Problem auch immer Sie angehen, ich bin ziemlich überzeugt, dass Sie Preon erweitern können, indem Sie einen 'Codec',' CodecFactory' und vielleicht einige Anmerkungen hinzufügen, um es zu ermöglichen. –
Hallo, @WilfredSpringer, schön dich zu treffen! So weit ich es verstehe, verschiebt man seinen eigenen 'Codec' und ähnliche Klassen in Preon technisch von" deklarativem "Land in" imperatives "Land, während du buchstäblich Code schreibst, der den Strom von Hand liest/schreibt. Das war mein einziger Punkt, Preon "limited" zu nennen. Es tut mir leid, wenn dich das beleidigt hat, es war keine Beleidigung gemeint. In der Zwischenzeit ist viel Zeit verstrichen, seit diese Frage gestellt wurde, Kaitai Struct bekam eine Typumschaltung, die sofort implementiert wurde. – GreyCat
Keine Sorge, in keiner Weise beleidigt. ;-) Ich denke, Preon erlaubt es dir, seine deklarativen Fähigkeiten zu erweitern. Erstellen Sie neue Versionen von Preon, indem Sie eine einzige Schnittstelle implementieren, sodass zukünftige Benutzer diese neue Funktionalität nur deklarativ nutzen können. –