考虑组织为数据段的二进制文件,其中前4个字节是段类型,接下来的4个字节是段长度,其余字节是原始数据。我可以解析第一部分,如:
named!(my_parser<&[u8], SomethingParsed>, do_parse!(
segment_type: take!(4) >>
segment_length: be_u32 >>
segment_data: take!(segment_length) >>
(SomethingParsed {segments: ?})
))
如何重复该步骤,直到我到达文件末尾?
您可以使用many0
将解析器应用0次或更多次(如果您需要至少一次传递,则使用many1
)。
named!(my_iterated_parser<&[u8], Vec<SomethingParsed>>, many0!(my_parser));
参考:https://github.com/Geal/nom/blob/master/doc/choosing_a_combinator.md