代码之家  ›  专栏  ›  技术社区  ›  timday

冲洗增压器::iostreams::zlib_压缩机。如何获得“同步刷新”?

  •  4
  • timday  · 技术社区  · 16 年前

    要获得一个 "zlib sync flush" 使用时 boost::iostreams::zlib_compressor ?只是调用 flush 在过滤器上,或 strict_sync 在一 filtering_ostream 包含它并不能完成任务(例如,我希望压缩器能够足够地刷新,以便压缩器可以恢复到目前为止压缩器所消耗的所有字节,而无需关闭流)。

    看着 header ,似乎定义了一些“刷新代码”(尤其是 sync_flush )但我不清楚它们应该如何使用(记住,我的压缩机只是添加到 过滤层 )

    2 回复  |  直到 16 年前
        1
  •  1
  •   timday    16 年前

    事实证明,存在一个根本问题, symmetric_filter 那个 zlib_compressor 继承自本身并不容易(似乎 疏忽)

    可能会向 对称滤波器 只需添加 flushable_tag 以及公开现有的私有刷新方法,但现在我可以接受它。

        2
  •  0
  •   Rudi Cilibrasi    11 年前

    这个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的主要区别在于,与使用模板类过滤器不同的是,您只需传入一个字符串,然后写出压缩后的字符串,该字符串的结果可以满足您的需要。每个字符串将被刷新(在自动刷新模式下),以便在交互式网络协议中使用。最后,只需调用finish获取最后一位压缩数据和一个终止块。虽然boost示例较短,但它需要使用另外两个不如std::string知名的模板类,即过滤_streambuf和标准较差的boost::iostreams:copy。zlib的boost接口不完整,因为它不支持z-sync-flush。这意味着它不适用于在线流应用程序,如TCP交互协议。我喜欢在我的C++项目中提升并使用它作为我的主要C++支持库,但是在这个特殊的情况下,由于缺少刷新功能,它不能在我的应用程序中使用。