1

我想要一个 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_position_message 类型,rowing::但我不能对枚举做同样的事情。如果我像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

提前感谢您的任何想法。

4

1 回答 1

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'

对于枚举可能的另一个选项(理论上,您宁愿在实践中不使用它),请在https://github.com/kaitai-io/kaitai_struct/issues/643.to_i上查看更深入的解释。

于 2019-11-11T07:56:26.430 回答