Прочитайте фрагмент байтов &[u8] побитно

Я пишу программу для сокрытия данных в файлах PNG. У меня проблема заключается в побитовом чтении данных в форме &[u8] (или Vec<u8>).


struct Data {
    bytes: Vec<u8>,
    index: usize,
}

impl Data {
    fn read_bits(&mut self, n: usize) -> u8 {
        // this function is the issue I don't know how to
        // do this I want this function to read n bits from 
        // self.bytes and return them.
        // if the current read byte is 0b11001011 and n = 2
        // the function should return 0b11 as u8 and update
        // self.index to make sure the next read returns
        // 0b10 aka the next 2 bits from 0b11001011
    }
}

Причина, по которой мне нужны данные в этой форме, заключается в том, что я хочу заменить младшие биты значений цвета в png битами из Vec<u8>

let mut red = ...; // the red channel from a pixel
red = red & 0b11111100; // remove the last 2 bits
red = red + data.read_bits(2); // read two bits from data and add it to the red channel

Привет. Пожалуйста, предоставьте минимально воспроизводимый пример . Не забудьте указать типы показываемых вами переменных, и если вы используете какие-либо библиотеки, укажите, какие именно. В теге ржавчины есть раздел, как предоставить MRE специально для кода ржавчины.

Aleksander Krauze 25.07.2024 11:48

Вы пытаетесь реализовать read_bits() и застряли, или у вас проблема с read_bits(), предоставленным сторонним ящиком (вот этот приходит на ум)? Если первое, не могли бы вы отредактировать вопрос, включив в него существующую реализацию и более подробное описание того, почему она не соответствует вашим целям? В частности, мне неясно, что вы подразумеваете под «вернуть скрытые данные» и «обратить этот процесс вспять».

user4815162342 25.07.2024 12:04

Извините, что вызвал путаницу с сокрытием данных. Я переписал вопрос, чтобы он был более точным в отношении проблемы, с которой я столкнулся. У меня нет проблем со сторонней библиотекой, у меня проблемы с реализацией функции read_bits.

lynx_xdg 25.07.2024 12:13

Где именно ты застрял? Алгоритм прост: отслеживаем индекс бита, получаем индекс байта (бит %8), с помощью битового вращения получаем правильные биты, возможно слияние и со следующим байтом.

Chayim Friedman 25.07.2024 13:24

Слияние со следующим байтом было основной проблемой: при извлечении 3 битов из байта оставалось только 2 бита.

lynx_xdg 25.07.2024 13:27
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
2
7
83
1
Перейти к ответу Данный вопрос помечен как решенный

Другие вопросы по теме