2016-07-21 25 views
3

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?

Antwort

2

Nun, Sie haben Recht, und diese Funktion wurde wie 3 oder 4 Mal bereits angefordert;) Ich habe filed an issue dafür.

Ich kann mich nicht auf die Implementierung von Preon einigen, aber es scheint mir sehr begrenzt zu sein. Sie können nur ein einziges "Präfix" haben, es ist immer Ganzzahl, und es muss immer unmittelbar vor dem Punkt Ihrer Wahl stehen.

ich ein wenig mehr generic switch Artaussage, so etwas implementieren möchten:

- id: value 
    switch: code 
    cases: 
     string: 
     type: bson_string 
     document: 
     type: bson_document 
     boolean: 
     type: u1 
     int32: 
     type: s4 
     int64: 
     type: s8 

Was halten Sie davon denken?

Beachten Sie, dass Sie wahrscheinlich nicht die "richtige" OOP-Objekthierarchie bekommen werden, wie Sie es von Preon gewohnt sind. Das liegt daran, dass die Preon-Klassen von Hand gemacht werden, und Sie können tatsächlich die gemeinsame Superklasse machen und sowohl FloatNamedElement als auch UTF8NamedElement davon erben, aber ich kann mir im aktuellen KS-Modell keine Methode vorstellen, dies zu tun.

+0

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. –

+0

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

+0

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. –