如何检查文件是否被gzip压缩?

我有一个C / C ++程序需要读取一个文件,该文件可能是也可能不是gzip压缩的。 我知道我们可以使用zlib中的gzread()来读取压缩文件和未压缩文件 – 但是,如果文件是gzip压缩的,我只想使用zlib函数(出于性能原因)。

那么有什么方法可以以编程方式检测或检查某个文件是否是从C / C ++中解压缩的?

文件开头有一个幻数。 只需读取前两个字节并检查它们是否等于0x1f8b

你是否更喜欢误报,漏报,或者根本没有错误的结果(表现得很糟糕……)?

RFC 1952:GZIP文件格式规范版本4.3规定文件的前2个字节(因此每个成员,因此)是'\x1F''\x8B' 。 将其用于可能导致误报的第一次检查。

使用gzread()读取压缩文件和未压缩文件之间的性能差异是什么?

无论如何,为了检测文件是否被gzip压缩,您可以根据链接读取文件开头的幻数 ,即1f 8b

您可以测试RFC 1951和1952中描述的签名以获得一个想法。 对于GZIP文件,第二个是相关的,它是确定的。 其他格式存在一些误报,因此您应该检查合理值的标题。

对于zlib流来说,它更难一些,因为它们更容易出现误报。 但是你很少会在自己的野外遇到那些。