我需要从 u8s 数组中解析一个 32 位整数数组(小字节序),但是下一个整数仅在当前整数的第 31 位被设置时才存在。如果其余的不存在,则数组的其余部分应设置为零。我不确定如何有条件地解析下一个元素。
假设该字段长 4 个字节。那么 parse_field 函数的结果就是这 4 个字节将被 le_u32 解析,这将是 [u32; 中的第一个元素;8] 数组。但是,如果设置了该字段的第 31 位。然后还有另外 4 个字节,它也像这个字段,它进入数组中的下一个元素。如果未设置,则函数必须返回,其余元素设置为零的数组。对于每个现有字段,这将继续。
例如对于以下输入:
0x8000000a
0x8000000b
...
你会得到[0x8000000a, 0x8000000b, 0, 0, 0, 0, 0, 0]
但是如果输入是
0x8000000a
0x8000000b
0x8000000c
0x8000000d
0x8000000e
....
然后你会得到[0x8000000a, 0x8000000b, 0x8000000c, 0x8000000d, 0x8000000e, 0, 0, 0]
extern crate nom;
use nom::*;
#[derive(Clone, Copy, Debug)]
struct Derp {
field: [u32; 8]
}
named!(parse_field<[u32; 8]>,
// what do I do here
);
named!(parse_derp<Derp>,
do_parse!(
field: parse_field >>
(Derp {
field: field
})
)
);
fn main() {
let temp = [0x0a, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x00, 0x80];
println!("{:?}", parse_derp(&temp));
}
在这里使用 Vec 可能更好吗?