Нет надежного способа получить несжатый размер файла 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
, что может быть неправильно.