1

我有一个序列,它有一个带有重复表达式的“id”,我需要重复未知次数,我不确定当前是否支持。

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

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

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

但是,即使在元数据中使用“ks-opaque-types:true”,我也会收到无法访问“CalculateRepetitions”的错误。

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

在此先感谢您的任何建议。

4

1 回答 1

1

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

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);
  }
}
于 2019-02-02T19:24:16.240 回答