Размер несжатого файла с помощью функции доступа к файлам zlib gzip - PullRequest
5 голосов
/ 09 февраля 2012

Используя инструмент командной строки linux gzip, я могу определить несжатый размер сжатого файла, используя gzip -l.

Я не смог найти такую ​​функцию в разделе руководства zlib "Функции доступа к файлу gzip".

По этой ссылке я нашел решение http://www.abeel.be/content/determine-uncompressed-size-gzip-file, которое предполагает чтение последних 4 байтов файла, но сейчас я избегаю его, потому что предпочитаю использовать функции lib.

1 Ответ

16 голосов
/ 09 февраля 2012

Нет надежного способа получить несжатый размер файла gzip без распаковки или, по крайней мере, декодирования всего этого.Для этого есть три причины.

Во-первых, единственная информация о несжатой длине - это четыре байта в конце файла gzip (хранятся в младшем порядке).По необходимости это длина по модулю 2 32 .Поэтому, если длина несжатого файла составляет 4 ГБ или более, вы не будете знать, что это за длина.Вы можете быть уверены, что длина несжатого файла меньше 4 ГБ, если длина сжатого файла меньше 2 32 / 1032 + 18 или около 4 МБ.(1032 - это максимальный коэффициент сжатия для deflate.)

Во-вторых, и это еще хуже, файл gzip может фактически быть объединением нескольких потоков gzip.Кроме декодирования, нет способа найти, где заканчивается каждый поток gzip, чтобы посмотреть несжатую длину в четыре байта этого фрагмента.(Что может быть неверно в любом случае по первой причине.)

В-третьих, файлы gzip иногда будут содержать нежелательные файлы после окончания потока gzip (обычно нули).Тогда последние четыре байта не являются длиной.

Так что gzip -l на самом деле не работает в любом случае.В результате нет смысла предоставлять эту функцию в zlib.

pigz имеет возможность фактически декодировать весь ввод для получения фактической несжатой длины: pigz -lt, что гарантирует правильный ответ.pigz -l делает то, что делает gzip -l, что может быть неправильно.

...