Я пишу программу для сокрытия данных в файлах 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
Вы пытаетесь реализовать read_bits()
и застряли, или у вас проблема с read_bits()
, предоставленным сторонним ящиком (вот этот приходит на ум)? Если первое, не могли бы вы отредактировать вопрос, включив в него существующую реализацию и более подробное описание того, почему она не соответствует вашим целям? В частности, мне неясно, что вы подразумеваете под «вернуть скрытые данные» и «обратить этот процесс вспять».
Извините, что вызвал путаницу с сокрытием данных. Я переписал вопрос, чтобы он был более точным в отношении проблемы, с которой я столкнулся. У меня нет проблем со сторонней библиотекой, у меня проблемы с реализацией функции read_bits
.
Где именно ты застрял? Алгоритм прост: отслеживаем индекс бита, получаем индекс байта (бит %8), с помощью битового вращения получаем правильные биты, возможно слияние и со следующим байтом.
Слияние со следующим байтом было основной проблемой: при извлечении 3 битов из байта оставалось только 2 бита.
Привет. Пожалуйста, предоставьте минимально воспроизводимый пример . Не забудьте указать типы показываемых вами переменных, и если вы используете какие-либо библиотеки, укажите, какие именно. В теге ржавчины есть раздел, как предоставить MRE специально для кода ржавчины.