【问题标题】:Compress data to chunks using Zlib使用 Zlib 将数据压缩成块
【发布时间】:2015-05-31 09:00:13
【问题描述】:

我想用 zlib 压缩一个大小 > 50mb 的文件。 但我希望压缩文件是块(例如,32Kb 块)。

我不想读取 32Kb 的未压缩文件并对其进行压缩。 压缩文件应包含 32kb 压缩块。 压缩应在avail_out = 32kb 之后重置。

我只需要用 zlib 来做,这是为了随机访问。

这是我目前所拥有的:

do {
    strm.avail_in = fread(in, 1, CHUNK, source);

    flush = feof(source) ? Z_FINISH : Z_FULL_FLUSH;
    strm.next_in = in;
    strm.next_out = out;

    strm.avail_out = CHUNK;
    deflate(&strm, flush);

    if (strm.avail_out == 0)
        have = tmp;
    else
        have = CHUNK - strm.avail_out;

    fwrite(out, 1, have, dest);

    tmp = strm.avail_out;

    if (tmp == 0)
        deflateReset(&strm);

} while (flush != Z_FINISH);

但是这段代码有几个问题。

  1. 当我每 32Kb 重置压缩时,我会丢失一些尚未写入的压缩字节,因为 avail_out 已满;如果我尝试编写它们,那么压缩块将不再是 32Kb。

  2. 如果我知道在填充avail_out 时压缩了多少数据,我可以重置文件位置并从那里开始压缩。

【问题讨论】:

  • 你试过什么?您可以添加当前解决方案的一些代码吗?我之所以问,是因为这看起来像是一项大学作业,您希望其他人为您完成这项工作。
  • 这不是大学作业。我编辑了帖子。谢谢

标签: c zlib


【解决方案1】:

无法保证您可以准确地填充所需的大小,但您可以非常接近。请参阅fitblk.c 了解如何操作。

【讨论】:

  • 感谢zlib的作者。虽然这不是答案,但我认为这是我能得到的最接近的答案。所以我将其标记为答案。
猜你喜欢
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多