Как узнать, сколько файлов zlib содержится в одном файле zlib?

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

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

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

2 ответа

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

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

Для получения подробной информации о формате zlib см. RFC 1950 и соответствующую спецификацию DEFLATE, которая называется RFC 1951.

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

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

Дальнейшее уточнение этого "фильтра" возможно. Смотрите поле FLG в RFC1952.

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

Другие вопросы по тегам