使用 nom 读取二进制 u32
Read binary u32 using nom
我很难找到任何有关如何使用 nom 解析二进制文件的有用示例,因为文档似乎严重偏向 &str
输入解析器。
我只想在这里创建一个函数,它将读取 4 个字节,然后将其转换为 u32
和 return 结果。这是我的功能:
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`
做我正在尝试的事情的规范方法是什么?
take()
return Self
又名您的输入,在您的情况下切片 &[u8]
.
map_res()
is used to map a Result
, from_be_bytes()
没有 return 结果,该文档还包含一个使用 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
我很难找到任何有关如何使用 nom 解析二进制文件的有用示例,因为文档似乎严重偏向 &str
输入解析器。
我只想在这里创建一个函数,它将读取 4 个字节,然后将其转换为 u32
和 return 结果。这是我的功能:
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`
做我正在尝试的事情的规范方法是什么?
take()
return Self
又名您的输入,在您的情况下切片 &[u8]
.
map_res()
is used to map a Result
, from_be_bytes()
没有 return 结果,该文档还包含一个使用 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