提升Iostreams,用自制链接gzip过滤器

时间:2013-11-04 13:19:25

标签: c++ boost gzip filtering iostream

我在使用Boost Iostreams库的gzip过滤器时遇到了执行问题,并结合了缓冲的自制库。我想知道我的方法有什么问题。

首先,我的过滤器是一般的DualFilter。它在转换和put / return之前使用缓冲区(16字节)。我的过滤器的类别是可关闭的和dual_use。 您可以在此邮件的末尾找到代码详细信息。

我的问题是([a / b]表示带字母a和b的分隔案例): 如果我采用写入和读取的6种可能性:

1) io::filtering_[i/o]stream stm;
2) stm.push(io::gzip_[de/]compressor());
3) stm.push(my_[Unt/T]ransFilter);

目前使用stm。[get / put]来读/写

1)-2)     works perfectly
1)-3)     works perfectly
1)-3)-2) works perfectly
1)-2)-3) Stay stuck (obviously it is the one I really need)

实际上在最后一种情况下,gzip过滤器将这个无限循环赋予TransFilter的put:

31 -117 8 0 0 0 0 0 0 31 -117 8 0 0...

bzip过滤器也会出现类似情况(即使它的循环稍长)。

我做错了什么?有人可以帮帮我吗?

提前致谢

克里斯托弗

PS:这里是我的过滤器的简化实现

template<typename Source>
int get(Source& src)
{
  //at the very beginning or if the buffer are fully returned
  if (fcurrent_pos == fblkLength)
    {
      fcurrent_pos =0;
      FillThem (src); //fill&transform the buffers with the right number of src.get()
      fc=CheckNSolveBufferIsEnd (src); //eventually prepare read the suffix of the file
    }

  //The effective return
  if (fcurrent_pos < fUntrans.size ())
    return (int)fUntrans[fcurrent_pos++];
  else
    return fc;
}

template<typename Sink>
bool put(Sink& dest, int c)
{
  if (c==EOF || c ==boost::iostreams::WOULD_BLOCK)
    return false;

  if (fUntrans.size () < fblkLength - 1)
    {
      fUntrans.AddData((char*)(&c),1);
      return true;
    }
  fUntrans.AddData((char*)(&c),1);

  fenc->TransformThis (fUntrans, fTrans, fKey);


  for (int i=0; i<fblkLength; i++)
    {
      if (!boost::iostreams::put(dest, (int)fTrans[i]))
        return false;
    }

  return true;
}

template<typename Sink>
bool close (Sink &dest, BOOST_IOS::openmode m)
{
  if (fFlushed)
    return true;

  PrepareSuffix ();

  for (int i=0; i< fblkLength*2; //suffix length
       i++)
    {
      if (!boost::iostreams::put(dest, (int)fTrans[i]))
        return false;
    }
  return true;
}

0 个答案:

没有答案