Остальные данные, возвращаемые nom :: bits :: bits, неверны

Я пытаюсь взять 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 неверен. Я ошибаюсь в коде или что-то пропускаю?


person xiaoai    schedule 12.07.2020    source источник


Ответы (1)


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

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

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

person harmic    schedule 12.07.2020
comment
Итак, если это правда, я должен брать байт один за другим и использовать бинарный оператор / оператор сдвига, чтобы получить то, что мне нужно? Или есть какой-нибудь другой способ сохранить отброшенные биты? - person xiaoai; 12.07.2020