Вызвать внешний код, чтобы определить количество повторений выражения - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть последовательность, в которой есть 'id' с повторяющимся выражением, которое мне нужно повторять неизвестное число раз, и я не уверен, поддерживается ли это в настоящее время.

data_channels:
  seq:
    - id: fast_data
      type: u2
      repeat: expr
      repeat-expr: ???

Что яхотел бы иметь возможность вызвать внешний метод, который вычисляет правильное количество повторений и возвращает это число в кайтай.Например:

data_channels:
  seq:
    - id: fast_data
      type: u2
      repeat: expr
      repeat-expr: CalulateRepetitions

Однако, даже если в метаданных есть «ks-opaque-types: true», я получаю сообщение об ошибке, что «CalculateRepetitions» недоступен.

Числоповторения зависят от ряда вещей, которые просто недоступны из кайтай, поэтому внешний метод является идеальным решением.

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

1 Ответ

0 голосов
/ 02 февраля 2019

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

data_channels:
  params:
    - id: num_items
      type: u4
  seq:
    - id: fast_data
      type: u2
      repeat: expr
      repeat-expr: num_items

Если вы не знаете этого перед синтаксическим анализом, вы можетевсе еще используйте этот трюк для перехода к непрозрачному типу и обратно, то есть:

meta:
  id: your_main_type
  ksc-opaque-types: true
seq:
  - id: something
    type: u1
  # at this point we don't know number of repetitions yet
  - id: data_channels
    type: opaque_data_channels_wrapper

После этого внедрите класс OpaqueDataChannelsWrapper в своем приложении.Если есть, это может быть что-то вроде этого:

class OpaqueDataChannelsWrapper {
  public OpaqueDataChannelsWrapper(KaitaiStream io) {
    // do something here to determine number of repetitions

    // dive back into KaitaiStruct parsing with that information
    DataChannels realDataChannels = new DataChannels(io, numRepetitions);
  }
}
...