【问题标题】:Seeking in the uncompressed data with Minizip使用 Minizip 在未压缩数据中查找
【发布时间】:2015-10-05 14:06:35
【问题描述】:

我正在使用作为 Zlib 的一部分分发的 minizip 包来解压缩内存中的文件。我希望能够在存档中当前打开的文件中的未压缩数据中寻找任意位置。这样做的最佳方法是什么?

在 API 中,我看到以下内容:

extern int ZEXPORT unzSetOffset ( unzFile file, uLong pos );

但这似乎是在存档文件本身中寻找原始位置,而不是在当前打开的文件中。在绝对最坏的情况下,我可以关闭并重新打开文件,然后丢弃 x 个字节,直到我到达正确的位置,但这会很糟糕。有没有更好的办法?

【问题讨论】:

    标签: c zip zlib unzip


    【解决方案1】:

    问题在于压缩流不是上下文无关的:您需要解压缩所有以前的数据才能达到正确的给定状态。

    不幸的是,看看 WinZip 或 WinRAR 是如何处理这个问题的:它们在后台解压缩您的所有数据,以便能够透明地处理任何数据。

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的快速回答。我的下一个问题是,在原始流中搜索后,绝对没有办法让解压缩器恢复吗?
    【解决方案2】:

    我遇到了类似的问题,不久前为 minizip 写了一个补丁。 如果您搜索过 unzSeek,您就会找到它。

    https://github.com/nmoinvaz/minizip/pull/30

    【讨论】:

    • 感谢您的链接。我相信当我问这个问题时我回头看了这个,但是在我找到它的时候已经写了一个类似的实现。如果压缩是“存储”,我会直接寻找,否则我会寻找开头并丢弃 X 字节,这当然非常慢,但我能想到的唯一后备。
    • 更好。如果方法是存储,您可以只使用带有偏移量的普通文件 i/o API。 minizip 无需更改。或者这就是你的意思?
    • 这就是我的意思。我的 Minizip 版本未修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多