2012-09-23 154 views
0

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

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

我想过检查Z_BUF_ERROR,然后发送它并重新启动整个压缩过程,但我不确定是否所有悬而未决的输入/输出都已刷新。

有一些其他的方式,我可以去这样做 - 即确保当输出缓冲器(压缩数据大小)都只有1024K字节的数据包被发送。

+0

O/P? OP? IP?请定义。 –

+0

O/P或OP =>存储压缩数据的输出缓冲区IP或I/P =>存储原始数据的输入缓冲区。 – Zshn

+3

如果你只是想将'deflate()'的输出分解为1K块,那么只需要在输出为1K的地方提供'deflate()',即'strm.avail.out = 1024;'。提供输入到'deflate()'直到'strm.avail.out == 0'或者用完输入。然后写出该块。 –

回答

0

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