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

发布于 2024-11-07 22:57:35 字数 179 浏览 4 评论 0原文

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

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

I have a C / C++ program which needs to read in a file that may or may not be gzip compressed. I know we can use gzread() from zlib to read in both compressed and uncompressed files - however, I want to use the zlib functions ONLY if the file is gzip compressed (for performance reasons).

So is there any way to programatically detect or check if a certain file is gzipped from C / C++?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

电影里的梦 2024-11-14 22:57:35

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

There is a magic number at the beginning of the file. Just read the first two bytes and check if they are equal to 0x1f8b.

妄司 2024-11-14 22:57:35

您更喜欢误报、漏报还是根本没有错误结果(性能会下降……)?

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

Do you prefer false positives, false negatives, or no false results at all (there goes performance down the drain...)?

The RFC 1952: GZIP file format specification version 4.3 states the first 2 bytes (of each member and therefore) of the file are '\x1F' and '\x8B'. Use that for a first check that can result in false positives.

神魇的王 2024-11-14 22:57:35

使用 gzread() 读取压缩文件和未压缩文件的性能有何差异?

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

What is the difference in performance between reading compressed and uncompressed files using gzread()?

Anyway, in order to detect if a file is gzipped, you can read the magic number at the beginning of the file, which is 1f 8b according to the link.

悲念泪 2024-11-14 22:57:35

您可以测试 RFC 1951 和 1952 中描述的签名来了解一下。对于 GZIP 文件,第二个是相关的并且是确定的。其他格式存在一些误报,因此您应该尽可能多地检查标头以获取合理的值。

对于 zlib 流来说,这有点困难,因为它们更容易出现误报。但你很少会在野外遇到它们。

You can test for the signatures described in the RFCs 1951 and 1952 to get an idea. For GZIP files the second one is the relevant and it is definitive. There are some false positives on other formats, so you should check as much of the header for plausible values.

For just zlib streams it's somewhat harder, because they are even more prone to false positives. But you would rarely encounter those in the wild on their own.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文