调用外部代码确定重复表达式的次数

Call external code to determine number of times to repeat expression

我有一个包含 'id' 的序列,其中有一个重复表达式,我需要重复未知次数,我不确定目前是否支持它。

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

我想做的是调用一个外部方法来计算正确的重复次数,然后 returns 将该数字发送给 kaitai。喜欢:

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

然而,即使在元数据中使用 "ks-opaque-types: true",我仍然收到无法访问 "CalculateRepetitions" 的错误。

重复的次数取决于一些无法从 kaitai 访问的东西,因此外部方法是一个完美的解决方案。

提前感谢您的任何建议。

如果您知道类型调用之前的重复次数,您可以将其声明为类型参数并从您的应用程序中传递它:

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。如果有,它可能是这样的:

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);
  }
}