Я строю реализацию git clone в Rust. Я попал в ту часть, где мне нужно разобрать пакетный файл, чтобы создать индекс, и я почти закончил его разбор.Как я могу сфотографировать данные zlib и узнать, сколько там было входных байтов?
Каждый объект в файле packfile состоит из заголовка (который я уже правильно разбираю), за которым следует содержимое, которое сжато zlib.
Примечательно, что размер, хранящийся в заголовке, составляет , размер и, следовательно, больше, чем фактические данные, которые мы должны пропустить, чтобы перейти к следующему заголовку.
Crates.io показывает 2 ящиков, которые делают ZLIB декомпрессию и имеют более чем несколько загрузок:
libz-sys
: Является ли практически привет мир и был так в течение нескольких месяцевflate2
: Это правильно выкачивает данные с легкостью:print!("Object type {} size {}", obj_type as u8, obj_size); println!(" data:\n{}", String::from_utf8( ZlibDecoder::new(data).read_exact(obj_size as usize).unwrap() ).unwrap() );
Вот проблема. После этого мне нужно начать читать заголовок следующего объекта, но ZlibDecoder
не дает никакого способа определить, насколько большой вход был.
Он берет на себя ответственность читателя как его ввод, а не ссылку.
Из-за этого, хотя у меня есть выходной размер объекта (и действительно все данные объекта), так как я не знаю размер ввода, я не могу начать читать следующий заголовок объекта.
Как получить объем сжатых входных байтов, необходимых для достижения ожидаемого размера вывода? Если возможно, я бы хотел избежать использования FFI для вызова родного zlib.
PS: flate2
документы свидетельствуют о helper trait, но я понятия не имею, как или, если это поможет мне
Ужасный неприятный хак - это то, что доктор заказал! –