C ZLIB压缩

C ZLIB压缩,c,compression,zlib,C,Compression,Zlib,我正在做一个项目,如果我的磁盘出了问题,我会在使用ZLIB压缩后将内存块发送到另一个磁盘。然后我计划下载这个转储文件并用于进一步调试。这种压缩和上传是一次一块完成的,比如说1024K 问题是,我需要在上传到另一个磁盘之前有1024K的输出块(除此之外,还有头和尾文件,所以这个块大小就是压缩数据的大小),这样我就可以轻松地解压并使用它们。我尝试更改put_byte函数,这样一旦输出缓冲区为1024K,我就可以将其发送到另一个磁盘,但这似乎不起作用 我想检查Z_BUF_错误,然后将其发送过来并重新启

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

问题是,我需要在上传到另一个磁盘之前有1024K的输出块(除此之外,还有头和尾文件,所以这个块大小就是压缩数据的大小),这样我就可以轻松地解压并使用它们。我尝试更改put_byte函数,这样一旦输出缓冲区为1024K,我就可以将其发送到另一个磁盘,但这似乎不起作用

我想检查Z_BUF_错误,然后将其发送过来并重新启动整个压缩过程,但我不确定是否已刷新所有挂起的输入/输出


还有其他一些方法可以让我这样做,即当输出缓冲区(压缩数据大小)有1024K字节时确保数据包被发送。

< P>也许你会使用像C++ ZLIbFress库这样的高级外观库来更好的运气。它使用std::string,不需要动态分配,因此您不需要自己管理任何缓冲区,只需输入std::string并写出返回的std::string,也不需要检查任何返回值,也不需要有条件地循环。它只是以字符串的形式工作:输入一个字符串,输出一个字符串,只要你愿意,就可以进行压缩或解压缩。对于GZip和ZLib这两种常见的压缩格式,您都可以从一些简短的工作示例程序开始。

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