在Kaitai Struct中引用外部文件中的枚举

时间:2019-11-08 13:10:19

标签: kaitai-struct

我想拥有一个Kaitai Struct ksy文件,该文件引用了不同外部文件中的一些枚举和类型。在外部文件中,我只希望具有子类型和枚举定义。

这是引用外部类型的测试文件( test.ksy

meta:
  id: test
  imports:
    - rowing
  endian: be

seq:
  - id: system_id
    type: u1
  - id: data
    type:
      switch-on: system_id
      cases:
        rowing_messages::position: rowing::rowing_position_message

,这是文件( rowing.ksy ),包括外部类型:

meta:
  id: rowing
  endian: be

enums:
  rowing_messages:
    0x10: position
    0x12: meter_per_stroke

types:
  rowing_position_message:
    seq:
      - id: id
        type: u1
      - id: timestamp
        type: u4

编译器抱怨:

test: /seq/1/type/cases/EnumByLabel(identifier(rowing_messages),identifier(position)): unable to find enum 'rowing_messages', searching from test

根据我的测试,看来我可以引用带有前缀rowing::的外部rowing_position_message类型,但对于枚举却不能这样做。如果我像rowing::rowing_messages::position那样做,编译器会抱怨:

/seq/1/cases/rowing::rowing_messages::position: parsing expression 'rowing::rowing_messages::position' failed on 1:24, expected "or" | CharsWhile(Set( , n)) | "\\\n" | End

提前感谢任何想法。

1 个答案:

答案 0 :(得分:1)

在这里rowing::是正确的行为,因为除此之外,编译器无法引用在外部类中声明的枚举。

此外,您需要通过添加

system_id声明为枚举,而不仅仅是整数
enum: 'rowing::rowing_messages'

此问题已在相对较新的编译器中得到解决(即> 0.8,任何现代的0.9不稳定快照都应工作),因此应能工作:

  - id: system_id
    type: u1
    enum: 'rowing::rowing_messages'
  - id: data
    type:
      switch-on: system_id
      cases:
        'rowing::rowing_messages::position': 'rowing::rowing_position_message'

对于在枚举上使用.to_i的另一种可能的选择(理论上,您不希望在实践中使用它),请在https://github.com/kaitai-io/kaitai_struct/issues/643上查看更详细的说明。