deflateInit2 有什么特别之处可以防止 deflateSetHeader 与 deflateInit 一起使用?

What's special about deflateInit2 that prevents deflateSetHeader be used with deflateInit?

我正在尝试学习如何在我的 C 语言项目中使用 zlib 函数。我需要在我的应用程序中同时支持 RFC-1950 zlib 格式和 RFC-1952 gzip 格式。

要使用 gzip 格式,必须使用 deflateSetHeader。但是在阅读 zlib source 的文档时,似乎说 deflateSetHeader 必须与 deflateInit2 一起使用,而不是 deflateInit。但是这个原因没有解释。

deflateSetHeader可以和deflateInit一起使用吗?或者为什么它必须与 deflateInit2?

一起使用

http://zlib.net/manual.html#Advanced

中都提到了

zlib 可以通过将 window-size 设置为大于 15 的值来请求生成 gzip 数据。此值只能设置为 deflateInit2 而不是 deflateInit

同样,小于 0 的值可用于请求原始“未包装”压缩数据。

不,您不需要使用 deflateSetHeader() 来生成 gzip 格式。您只需要使用 deflateInit2() 并使用 windowBits 参数值请求 gzip 格式。 deflateSetHeader() 的使用完全是可选的,仅当您希望 gzip header 内容不同于默认 header.

时才使用

是的,你只能在deflateInit2()之后使用deflateSetHeader(),因为deflateSetHeader()只适用于gzip header,并且请求gzip格式的唯一方法是第一个地方是使用 deflateInit2().