Как я могу узнать, сколько файлов zlib содержится в одном файле zlib? - PullRequest
1 голос
/ 14 августа 2010

Я хотел бы знать, как определить, сколько файлов zlib содержится в одном файле.

Пример;Думаю, у меня есть 5 разных файлов, и сжал их отдельно с помощью zlib.Затем я объединил их.Итак, у меня один файл содержит 5 разных файлов zlib.Теперь, как я могу найти, сколько файлов zlib в этом отдельном файле?Мне просто нужно узнать количество файлов zlib в одном файле.Я думаю, мне нужно сбросить его шестнадцатеричный код и записать магическое число, но я не мог понять, как это сделать.

Не могли бы вы мне помочь?

Ответы [ 2 ]

2 голосов
/ 14 августа 2010

Длина блока не сохраняется в данных, закодированных в zlib (за исключением несжатого блока ).Вместо этого конец блока обозначается токеном [256] в потоке.Но этот токен кодируется Хаффманом, а кодировка Хаффмана обычно , динамически генерируется , поэтому он может отличаться для каждого блока.Кроме того, закодированный токен может начинаться с любого бита байта, так что нет никакой возможности его "grep".Единственный способ найти маркер конца блока - это декодировать весь блок и проверить, когда вы нажали этот токен.

Я думаю, что вместо этого вы должны увидеть, содержит ли ваш контейнер какую-либо информацию о длине, и использовать ее для поискасколько сжатых данных.

Подробнее о формате zlib см. RFC 1950 и соответствующую спецификацию DEFLATE, которая RFC 1951 .

1 голос
/ 31 октября 2015

Если ваш единственный файл представляет собой конкатенацию нескольких файлов gzip, то вы можете найти верхнюю границу количества файлов.Формат Gzip начинается с волшебства 0x1f8b.

Подсчитайте возникновение магии в одном файле.Количество указывает, что у вас есть не более, чем столько файлов.К сожалению, это верхняя граница, а не точное количество файлов.Потому что 0x1f8b может также появиться в разделе данных случайно 1 из 64K байтов.Чтобы уменьшить количество ложных совпадений до 1 на ~ 24 миллионов байт, вместо этого можно сканировать 0x1f8b08.Трейлинг 0x08 - это поле «метод сжатия», которое всегда равно 8.

Возможны дальнейшие уточнения этого «фильтра».См. Поле FLG в RFC1952.

Если элементы одного файла имеют формат не gzip, а формат Zlib или raw, то вам не повезло;Вы должны распаковать, чтобы посчитать количество файлов - что бы я ни делал.

...