如何检查一个文件是否为gzip压缩格式?

36

我有一个需要读取文件的C / C++程序,该文件可能是gzip压缩的,也可能没有。我知道我们可以使用zlib中的gzread()函数来读取压缩和未压缩的文件 - 但是,为了性能原因,我只想在文件是gzip压缩的情况下使用zlib函数。

那么,有没有办法从C / C++程序中检测或检查某个文件是否是gzipped?


2
@Rob Kennedy:对于未压缩的文件,使用fread只需要1分钟,而使用gzread则需要20分钟,这是一个巨大的差异。可能与我们使用较旧版本的zlib有关,但现在我无法使用最新版本,所以必须进行条件读取。 - Deepak Prakash
4个回答

69

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


47
小心处理字节序和字节数。比较单独的数值而不是组合:(byte1 == 0x1f) && (byte2 == 0x8b) 相对于 first2bytes == 0x1f8b - pmg

13

您更喜欢误报、漏报还是完全没有错误结果(这将导致性能下降...)?

RFC 1952:GZIP 文件格式规范版本 4.3 规定了文件的前两个字节(每个成员及因此整个文件)为 '\x1F''\x8B'。可以使用此方法进行首次检查,但可能会出现误报。


3

使用gzread()读取压缩和未压缩文件的性能有什么区别?

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


关于性能:对于未压缩的文件,使用fread时需要1分钟,而使用gzread时需要20分钟。这可能与我们使用的旧版本zlib有关,但目前我不能使用最新版本 - 所以必须进行条件读取来解决这个问题。 - Deepak Prakash

1

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

对于仅zlib流,它们更容易出现误报,因为它们更容易出现误报。但是,您很少会在野外遇到这些问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接