5

使用时是否需要一些魔法来获得“zlib 同步刷新”boost::iostreams::zlib_compressor?只是flush在过滤器上调用,或者strict_syncfiltering_ostream包含它的容器上调用它并不能完成这项工作(即,我希望压缩器足够刷新,以便解压缩器可以恢复到目前为止压缩器消耗的所有字节,而无需关闭流)。

查看header,似乎定义了一些“刷新代码”(特别是 a sync_flush),但我不清楚它们应该如何使用(记住我的压缩器只是添加到 a 中filtering_ostream)。

4

2 回答 2

2

事实证明,有一个基本问题,symmetric_filterzlib_compressor继承自的 本身不是可刷新的(这似乎是一种疏忽)。

可能添加这样的支持symmetric_filter就像添加flushable_tag和公开现有的私有刷新方法一样简单,但现在我可以接受它。

于 2010-04-12T11:25:19.073 回答
1

这个 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 模式下),因此它可以在交互式网络协议中使用。最后只需调用完成以获取最后一位压缩数据和一个终止块。虽然 boost 示例更短,但它需要使用其他两个不像 std::string 那样知名的模板类,即 filtering_streambuf 和不太标准的 boost::iostreams:copy。zlib 的 boost 接口不完整,因为它不支持 Z_SYNC_FLUSH。这意味着它不适用于 TCP 交互协议等在线流应用。

于 2015-07-08T19:12:28.170 回答