Остальные данные, возвращаемые nom :: bits :: bits, неверны - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь взять 7 бит из вектора & [u8], используя nom :: bits :: bits, но обнаружил, что остальные данные неверны, кажется, это должно быть целое кратное 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 неверен. Я ошибаюсь в коде или что-то пропускаю?

1 Ответ

1 голос
/ 12 июля 2020

В документации для битов написано:

После этого ввод преобразуется обратно в синтаксический анализатор байтового уровня, а все оставшиеся биты отбрасываются.

Итак, когда вы берете 7 бит, последний бит отбрасывается, а оставшиеся данные байтового уровня начинаются со следующего полного байта.

...