2015-05-31 71 views
1

我想用zlib压缩大小大于50mb的文件。 但我想要压缩的文件是块(例如,32Kb块)。使用Zlib将数据压缩为块

我不想读取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

你有什么试过?你可以添加一些当前解决方案的代码吗?我问,因为这看起来像一个单一的任务,你想让别人为你做这项工作。 – Augusto

+0

这不是一个uni任务。我编辑了这篇文章。感谢 – DeepSheet

回答

0

这是不可能的,以确保您可以确切地填写所需的大小,但你可以非常接近。请参阅fitblk.c了解如何操作。

+0

感谢zlib的作者。虽然这不是答案,但我认为这是尽可能接近的。所以我将其标记为答案。 – DeepSheet