1

我很难找到有关如何使用 nom 解析二进制文件的任何有用示例,因为文档似乎严重偏向&str输入解析器。

我只想在这里创建一个读取 4 个字节的函数,将其转换为 au32并作为结果返回。这是我的功能:

fn take_u32(input: &[u8]) -> IResult<&[u8], u32> {
    map_res(
        take(4),
        |bytes| Ok(u32::from_be_bytes(bytes))
    )(input)
}

我收到以下错误:

error[E0277]: the trait bound `[u8; 4]: From<u8>` is not satisfied
  --> src\main.rs:16:9
   |
16 |         take(4),
   |         ^^^^ the trait `From<u8>` is not implemented for `[u8; 4]`
   | 
  ::: C:\Users\cmbas\.cargo\registry\src\github.com-1ecc6299db9ec823\nom-7.1.0\src\bits\complete.rs:39:6
   |
39 |   O: From<u8> + AddAssign + Shl<usize, Output = O> + Shr<usize, Output = O>,
   |      -------- required by this bound in `nom::complete::take`

做我正在尝试的事情的规范方法是什么?

4

1 回答 1

2

take()返回Self又名您的输入,在您的情况下 slice &[u8]

map_res()用于映射 a Resultfrom_be_bytes()不返回结果,文档还包含一个使用TryInto::try_into.

要使您的代码编译,您需要使用map_opt()和使用try_into()将切片转换为数组:

fn take_u32(input: &[u8]) -> IResult<&[u8], u32> {
    map_opt(
        take(4),
        |bytes| int_bytes.try_into().map(u32::from_be_bytes)
    )(input)
}

也就是说 nom 已经有了这样的基本组合器be_u32

于 2021-11-17T04:11:32.140 回答