使用标称值5.0进行二进制文件解析

问题描述 投票:1回答:1

问题

[其中有一个文件具有多个头,但是对我来说,它只重要一个,后面的数据也很重要。该头在文件中重复多次。

其魔术数字是: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进行字节解析的示例,而且如果是生锈的新手也无济于事。如何使用这些规则解析所有块?

rust nom
1个回答
0
投票

nom版本

首先,对此表示歉意,操场上只有nom 4.0,结果代码在this github repository上。

要解析这样的内容,我们将需要组合两个不同的解析器:

  • take_until,将字节取至前同步码或EOF
  • take_until,以隔离序言

还有一个组合器,tag,所以我们可以抛弃解析器序列的第一个元素。

tag

该代码的注释应足够正确,以备后续使用。此操作将挖除所有字节,直到找到前导字节为止,然后挖除那些字节并保留所有内容,直到找到EOF字节序列(preceded)。

然后返回一个反向 preceded结果,因为它是一个示例。如果愿意,可以取消反向以将其与其他解析器组合。第一个元素是序列的内容,第二个元素是EOF之后的内容。这意味着您可以使用此函数进行迭代(我在我放在github上的仓库中的测试中做到了这一点。)>

© www.soinside.com 2019 - 2024. All rights reserved.