0

我正在尝试使用 nom::bits::bits 从 &[u8] 向量中取 7 位,但我发现剩下的数据不正确,似乎它必须是 4/8 的整数倍,但我不是当然。像这样的一些代码(nom = 5.12):

fn take_7_bits(i: &[u8]) -> IResult<&[u8], u32> {
    nom::bits::bits(nom::bits::complete::take::<_, _, _, (_, _)>(7_usize))(i)
}

fn main() {
    let input = vec![0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78];
    println!("origin: {:X?}", &input);
    let (remain, data) = take_7_bits(&input).unwrap();
    println!("remain: {:X?}", remain);
    println!("data: {:08X}", data);

    let (remain2, data2) = take_7_bits(&remain).unwrap();
    println!("remain2: {:X?}", remain2);
    println!("data2: {:08X}", data2);
}

和输出:

origin: [AB, CD, EF, 12, 34, 56, 78]
remain: [CD, EF, 12, 34, 56, 78]
data: 00000055
remain2: [EF, 12, 34, 56, 78]
data2: 00000066

从输出中,您可以看到剩余数据的开头与 4/8 的整数倍对齐。所以第二个data2是不正确的。我是否在代码中犯了任何错误或遗漏了什么?

4

1 回答 1

1

bits 的文档中,它说:

之后,输入被转换回字节级解析器,所有剩余的位都被丢弃。

因此,当您取 7 位时,最后一位被丢弃,剩余的字节级数据从下一个完整字节开始。

于 2020-07-12T02:41:56.227 回答