如何执行简单的 while 循环并使用 nom 解析二进制数据块?

How to perform a simple while loop and parse blocks of binary data with nom?

考虑组织为数据段的二进制文件,其中前 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));

Reference