【问题标题】:ZLIB compressionZLIB 压缩
【发布时间】:2012-09-23 09:37:29
【问题描述】:

我正在做一个项目,如果我的磁盘出现问题,我会在使用 ZLIB 压缩后将大块内存发送到另一个磁盘。这个转储然后我打算下载并用于进一步调试。这种压缩和上传将一次完成一个块 - 比如说 1024 K。

问题是我需要有正好 1024K 的输出块,然后我才能将它上传到另一个磁盘(除此之外还有标题和拖尾,所以这个块大小是压缩数据的大小),然后我可以轻松解压并使用它。我尝试更改 put_byte 函数,以便一旦输出缓冲区为 1024K,我可以将其发送到另一个磁盘,但这似乎不起作用。

我曾想过检查 Z_BUF_ERROR,然后将其发送过来并重新启动整个压缩过程,但我不确定是否所有待处理的输入/输出都已刷新。

我还有其他方法可以做到这一点 - 即确保在输出缓冲区(压缩数据大小)正好有 1024K 字节时发送数据包。

【问题讨论】:

  • O/P 或 OP => 存储压缩数据的输出缓冲区 IP 或 I/P => 存储原始数据的输入缓冲区。
  • 如果您只是想将deflate() 的输出分解为1K 块,那么只需为deflate() 提供1K 的输出,即strm.avail.out = 1024;。向deflate() 提供输入,直到strm.avail.out == 0 或您的输入用完。然后写出那个块。
  • @MarkAdler:嗨,马克,我对 ZLIB 库中的 put_byte 进行了以下更改:- 每当一个字符被复制到挂起的缓冲区中时,我都会将其复制到大小为 63K 的输出缓冲区中(这是不同于 next_out 指向的缓冲区)。我也在 flush_pending() 中进行了必要的更改。问题是当我对压缩数据运行充气时,我收到以下错误:-“无效或不完整的放气数据”。我没有更改窗口大小。仍然为什么我会出现这个错误??
  • 没有代码我不知道你在做什么。

标签: c compression zlib


【解决方案1】:

也许使用 C++ http://github.com/rudi-cilibrasi/zlibcomplete ZLibComplete 库等更高级别的外观库会更好。它使用 std::string 并且不需要动态分配,因此您不需要自己管理任何缓冲区,只需放入 std::string 并写出返回的 std::string 您也不需要检查任何返回值或你需要有条件地循环吗?它只是在字符串方面工作:只要你喜欢压缩或解压缩,放入一个字符串,取出一个字符串。对于常见的压缩格式 GZip 和 ZLib,您可以从简短的工作示例程序开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多