刷新boost :: iostreams :: zlib_compressor。如何获得“同步刷新”?

问题描述 投票:5回答:2

使用"zlib sync flush"时,获得boost::iostreams::zlib_compressor需要一些魔法吗?只需在过滤器上调用flush,或者在包含它的strict_sync上调用filtering_ostream就看不到这项工作(即我希望压缩器足够冲洗,以至于解压缩程序可以恢复到目前为止压缩器消耗的所有字节,而不关闭流)。

看看header,似乎有一些“冲洗代码”定义(特别是sync_flush)但我不清楚它们应该如何使用(记住我的压缩机只是加入了filtering_ostream)。

c++ boost zlib flush boost-iostreams
2个回答
2
投票

事实证明,symmetric_filter继承的zlib_compressor本身不可冲洗(这似乎是一种疏忽)是一个根本问题。

可能会向symmetric_filter添加这样的支持就像添加flushable_tag并暴露现有的私有冲洗方法一样简单,但是现在我可以忍受它。


0
投票

这个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 ++支持库,但在这种特殊情况下,由于缺少刷新功能,它在我的应用程序中无法使用。

© www.soinside.com 2019 - 2024. All rights reserved.