[其中有一个文件具有多个头,但是对我来说,它只重要一个,后面的数据也很重要。该头在文件中重复多次。
其魔术数字是:ASCII的A3046或十六进制的0x65 0x51 0x48 0x54 0x52
。找到第一个字节后,解析器必须占用所有字节,直到0xff
,然后重复其余报头,直到EOF。
首先我加载文件:
let mut file = OpenOptions::new()
.read(true)
.open("../assets/sample")
.unwrap();
let mut full_file: Vec<u8> = Vec::new();
file.read_to_end(&mut full_file);
我用以下符号声明魔术数字:pub static QT_MAGIC: &[u8; 5] = b"A3046";
作为测试,我编写了以下函数,以尝试是否可以找到第一个标头。
fn parse_block(input: &[u8]) -> IResult<&[u8], &[u8]> {
tag(QT_MAGIC)(input)
}
但是无论何时运行测试,Ok的值为None
。它绝对应该找到了东西。我做错了吗?
我没有发现使用nom5进行字节解析的示例,而且如果是生锈的新手也无济于事。如何使用这些规则解析所有块?
nom
版本首先,对此表示歉意,操场上只有nom 4.0,结果代码在this github repository上。
要解析这样的内容,我们将需要组合两个不同的解析器:
take_until
,将字节取至前同步码或EOFtake_until
,以隔离序言还有一个组合器,tag
,所以我们可以抛弃解析器序列的第一个元素。
tag
该代码的注释应足够正确,以备后续使用。此操作将挖除所有字节,直到找到前导字节为止,然后挖除那些字节并保留所有内容,直到找到EOF字节序列(preceded
)。
然后返回一个反向 preceded
结果,因为它是一个示例。如果愿意,可以取消反向以将其与其他解析器组合。第一个元素是序列的内容,第二个元素是EOF之后的内容。这意味着您可以使用此函数进行迭代(我在我放在github上的仓库中的测试中做到了这一点。)>