我有一个C / C ++程序需要读取一个文件,该文件可能是也可能不是gzip压缩的。我知道我们可以使用zlib中的gzread()读取压缩文件和未压缩文件 - 但是,如果文件是gzip压缩的,我只想使用zlib函数(出于性能原因)。
那么有没有办法以编程方式检测或检查某个文件是否是从C / C ++中删除的?
答案 0 :(得分:48)
文件开头有一个幻数。只需读取前两个字节并检查它们是否等于0x1f8b
。
答案 1 :(得分:8)
你是否更喜欢误报,漏报,或者根本没有错误的结果(表现不佳......)
RFC 1952: GZIP file format specification version 4.3表示文件的前2个字节(每个成员,因此)'\x1F'
和'\x8B'
。将其用于可能导致误报的第一次检查。
答案 2 :(得分:3)
使用gzread()读取压缩文件和未压缩文件之间的性能差异是什么?
无论如何,为了检测文件是否被gzip压缩,您可以根据链接阅读文件开头的magic number,1f 8b
。
答案 3 :(得分:1)
您可以测试RFC 1951和1952中描述的签名以获得一个想法。对于GZIP文件,第二个是相关的,它是确定的。其他格式存在一些误报,因此您应该检查标题的合理值。
对于zlib流而言,它更难,因为它们更容易出现误报。但你很少会在自己的野外遇到那些。