3

Kaitai Struct での最初のステップとして、練習として BSON パーサーを実行しようとしています。BSON 要素を解析する .ksy コードは次のようになります。

  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

お気づきかもしれませんが、繰り返しがたくさんあります。if追加の要素タイプを実行するたびに、ブロックを複製する必要があります。さらに悪いことに、基本的にそのようなフィールドごとに 3 回複製する必要があります。

  - id: el_string                    # <= string!
    type: bson_string                # <= string!
    if: el_type == bson_type::string # <= string!

私のターゲット言語は Java です。Kaitai の前は Preon しか試していませんでしたが、次のような条項がありました。

@Choices(prefixSize = 8, alternatives = {
    @Choice(condition = "prefix==0x01", type = FloatNamedElement.class),
    @Choice(condition = "prefix==0x02", type = UTF8NamedElement.class)
}
private NamedElement elements;

そこで、「プレフィックス」の値に基づいて、これら 2 つの要素を自動的に取得します。カイタイでできるんですか?

4

1 に答える 1