使用"zlib sync flush"时,获得boost::iostreams::zlib_compressor
需要一些魔法吗?只需在过滤器上调用flush
,或者在包含它的strict_sync
上调用filtering_ostream
就看不到这项工作(即我希望压缩器足够冲洗,以至于解压缩程序可以恢复到目前为止压缩器消耗的所有字节,而不关闭流)。
看看header,似乎有一些“冲洗代码”定义(特别是sync_flush
)但我不清楚它们应该如何使用(记住我的压缩机只是加入了filtering_ostream
)。
事实证明,symmetric_filter
继承的zlib_compressor
本身不可冲洗(这似乎是一种疏忽)是一个根本问题。
可能会向symmetric_filter
添加这样的支持就像添加flushable_tag
并暴露现有的私有冲洗方法一样简单,但是现在我可以忍受它。
这个C ++ zlib包装器库,我是作者,支持刷新功能,可以说更简单易用:
https://github.com/rudi-cilibrasi/zlibcomplete
这很容易:
#include <iostream>
#include <zlc/zlibcomplete.hpp>
using namespace zlibcomplete;
using namespace std;
int main(int argc, char **argv)
{
const int CHUNK = 16384;
char inbuf[CHUNK];
int readBytes;
ZLibCompressor compressor(9, auto_flush);
for (;;) {
cin.read(inbuf, CHUNK);
readBytes = cin.gcount();
if (readBytes == 0) {
break;
}
string input(inbuf, readBytes);
cout << compressor.compress(input);
}
cout << compressor.finish();
return 0;
}
与boost的主要区别在于,您只需传入一个字符串并写出压缩字符串,而不是使用模板类过滤器,而该字符串可以根据需要多次输出。每个字符串都将被刷新(在auto_flush模式下),因此可以在交互式网络协议中使用。最后,只需调用finish即可获得最后一位压缩数据和终止块。虽然boost示例较短,但它需要使用另外两个不像std :: string那样的模板类,即filtering_streambuf和较低标准的boost :: iostreams:copy。 zlib的boost接口不完整,因为它不支持Z_SYNC_FLUSH。这意味着它不适用于在线流媒体应用程序,例如TCP交互式协议。我喜欢使用boost并将其用作我所有C ++项目中的主要C ++支持库,但在这种特殊情况下,由于缺少刷新功能,它在我的应用程序中无法使用。