Как проверить, сжат ли файл gzip? - PullRequest
26 голосов
/ 19 мая 2011

У меня есть программа на C / C ++, которая должна читать файл, который может быть сжат gzip или нет.Я знаю, что мы можем использовать gzread () из zlib для чтения как сжатых, так и несжатых файлов - однако, я хочу использовать функции zlib ТОЛЬКО, если файл сжат gzip (по соображениям производительности).

Так что естьЛюбой способ программно обнаружить или проверить, GZIP-файл определенного файла из C / C ++?

Ответы [ 4 ]

49 голосов
/ 19 мая 2011

В начале файла есть магическое число.Просто прочитайте первые два байта и проверьте, равны ли они 0x1f8b.

8 голосов
/ 19 мая 2011

Предпочитаете ли вы ложные срабатывания, ложные отрицания или вообще никаких ложных результатов (производительность снижается ...)?

В спецификации спецификации формата файла RFC 1952: GZIP версии 4.3 указаны первые 2 байта (каждого элемента и, следовательно,) файла '\x1F' и '\x8B'. Используйте это для первой проверки, которая может привести к ложным срабатываниям.

3 голосов
/ 19 мая 2011

Какая разница в производительности между чтением сжатых и несжатых файлов с помощью gzread ()?

В любом случае, чтобы определить, распакован ли файл, вы можете прочитать магическое число в начале файла, которое равно 1f 8b по ссылке.

1 голос
/ 19 мая 2011

Вы можете проверить подписи, описанные в RFC 1951 и 1952 , чтобы получить представление.Для файлов GZIP второй является релевантным и является окончательным.Есть некоторые ложные срабатывания в других форматах, поэтому вы должны проверить как можно большую часть заголовка на возможные значения.

Для простых потоков zlib это несколько сложнее, потому что они еще более склонны к ложным срабатываниям.Но вы редко встречаетесь с теми, кто живет в дикой природе.

...