我正在使用 zlib 扩充一些旧文件。 不幸的是,这些文件由 3 部分组成:
第 1 部分:未压缩数据,然后
第 2 部分:zlib 压缩数据,以 0x789C 开头,后跟
第 3 部分:未压缩数据
这些文件的压缩数据长度未知(adler32 校验和已从第 2 部分中删除)。
膨胀这些文件第 2 部分的正确方法是什么?
我目前正在使用基于 zpipe.c 示例程序中的 inf 函数的代码来膨胀这些数据 (https://www.zlib.net/zpipe.c)。 膨胀成功进行,直到处理完压缩数据的最后一部分,此时我遇到 Z_DATA_ERROR(-3),无效的存储块长度。
如果我在 Z_DATA_ERROR 发生后停止膨胀,是否会省略文件第 2 部分的一部分,留下一些未处理的压缩数据?
另一方面,如果我处理缓冲区膨胀返回,尽管存在 Z_DATA_ERROR - 希望处理最后一个缓冲区然后停止 - 我收到的输出充满了无关的数据。
我在网上搜索过,但找不到有关如何继续操作的指导。 预先感谢您的帮助。
正确且完整的 zlib 流是自行终止的。它通过结束告诉你它结束在哪里。您将从
Z_STREAM_END
返回 inflate()
,而 inflate 输入缓冲区中未使用的内容就是 zlib 流之后的内容。
但是,如果您得到
Z_DATA_ERROR
,则它不是正确的 zlib 流。它在途中的某个地方已被损坏。