我有一个需要读取文件的C / C++程序,该文件可能是gzip压缩的,也可能没有。我知道我们可以使用zlib中的gzread()函数来读取压缩和未压缩的文件 - 但是,为了性能原因,我只想在文件是gzip压缩的情况下使用zlib函数。
那么,有没有办法从C / C++程序中检测或检查某个文件是否是gzipped?
我有一个需要读取文件的C / C++程序,该文件可能是gzip压缩的,也可能没有。我知道我们可以使用zlib中的gzread()函数来读取压缩和未压缩的文件 - 但是,为了性能原因,我只想在文件是gzip压缩的情况下使用zlib函数。
那么,有没有办法从C / C++程序中检测或检查某个文件是否是gzipped?
文件开头有一个神奇的数。只需要读取前两个字节并检查它们是否等于0x1f8b
即可。
(byte1 == 0x1f) && (byte2 == 0x8b)
相对于 first2bytes == 0x1f8b
。 - pmg您更喜欢误报、漏报还是完全没有错误结果(这将导致性能下降...)?
RFC 1952:GZIP 文件格式规范版本 4.3 规定了文件的前两个字节(每个成员及因此整个文件)为 '\x1F'
和 '\x8B'
。可以使用此方法进行首次检查,但可能会出现误报。
使用gzread()读取压缩和未压缩文件的性能有什么区别?
无论如何,为了检测文件是否被gzip压缩,您可以读取文件开头的魔数,根据链接,魔数是1f 8b
。
您可以测试RFC 1951和1952中描述的签名以获得想法。对于GZIP文件,第二个是相关的且是决定性的。其他格式存在一些误报,因此您应该检查标题的尽可能多的内容以获取合理值。
对于仅zlib流,它们更容易出现误报,因为它们更容易出现误报。但是,您很少会在野外遇到这些问题。