我在使用 Boost Iostreams 库的 gzip 过滤器以及缓冲的自制过滤器时遇到了执行问题。我想知道我这样做的方式有什么问题。
首先,我的过滤器是一个通用的 DualFilter。它在转换和放置/返回之前使用一个缓冲区(16 个字节)。我的过滤器的类别是可关闭的和双重使用的。您可以在此邮件的末尾找到代码详细信息。
我的问题是([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;
}