调用外部代码确定重复表达式的次数
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);
}
}
我有一个包含 '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);
}
}