使用Zlib

时间:2015-05-31 09:00:14

标签: c zlib

我想压缩大小为>的文件用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时压缩了多少数据,我可以重置文件位置并从那里开始压缩。

1 个答案:

答案 0 :(得分:0)

无法确保您可以准确填充所需的尺寸,但您可以非常接近。有关如何操作,请参阅fitblk.c