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