ZLIB:我应该如何膨胀未知长度的紧缩数据

问题描述 投票:0回答:1

我正在使用 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
1个回答
0
投票

正确且完整的 zlib 流是自行终止的。它通过结束告诉你它结束在哪里。您将从

Z_STREAM_END
返回
inflate()
,而 inflate 输入缓冲区中未使用的内容就是 zlib 流之后的内容。

但是,如果您得到

Z_DATA_ERROR
,则它不是正确的 zlib 流。它在途中的某个地方已被损坏。

© www.soinside.com 2019 - 2024. All rights reserved.