Подтвердить что ты не робот

Как проверить, сжат ли файл gzip?

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

Итак, есть ли способ программно обнаружить или проверить, что какой-то файл gzipped из C/С++?

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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