Ссылки на перечисления во внешнем файле в Kaitai Struct - PullRequest
1 голос
/ 08 ноября 2019

Я хотел бы иметь ksy файл Kaitai Struct, который ссылается на некоторые перечисления и типы в различных внешних файлах. Во внешних файлах я хотел бы иметь только определения подтипов и перечислений.

Это тестовый файл ( 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

Заранее благодарен за любые идеи.

1 Ответ

1 голос
/ 11 ноября 2019

Предварительное добавление rowing:: - правильное поведение, так как компилятор не может ссылаться на enum, объявленный во внешнем классе, за исключением этого.

Кроме того, вам нужно объявить system_idкак enum, а не просто целое число, добавив

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.

...