【发布时间】:2019-07-05 13:38:04
【问题描述】:
我为 Boost iostreams 编写了一个简单的过滤器,它检测文件是压缩的还是简单的文本,如果是,则委托给 gzip_decompressor。
问题是我在输入流中回溯以在解压缩器中再次提供数据。只有一些流不支持这一点,并因暴力线程异常而中断。
相反,我想,好吧,让我们使用 basic_array_source 来输入这两个字符,但是这个源不支持 read 调用!
所以这一直有效:
struct gz_decompressor {
typedef char char_type;
typedef boost::iostreams::multichar_input_filter_tag category;
boost::iostreams::gzip_decompressor m_decompressor{15, backtest::GzReader::GZIP_BUFFER_SIZE};
bool m_initialized{false};
bool m_is_compressed{false};
template<typename Source>
std::streamsize read(Source& src, char* s, std::streamsize n) {
if (!m_initialized) {
init(src, s, n);
}
if (m_is_compressed) {
return m_decompressor.read(src, s, n);
}
return boost::iostreams::read(src, s, n);
}
};
我想不通的部分是:
template<typename Source>
void init(Source& src, char* s, std::streamsize n) {
char header[2];
header[0] = boost::iostreams::get(src);
header[1] = boost::iostreams::get(src);
m_is_compressed = header[0] == static_cast<char>(0x1f) && header[2] == static_cast<char>(0x8b);
m_initialized = true;
boost::iostreams::basic_array_source<char> source(header);
if (m_is_compressed) {
m_decompressor.read(source, s, n); // Nope, is not allowed!
}
else {
boost::iostreams::read(source, s, n);
}
}
关于如何正确执行此操作的任何线索,即不回头?
【问题讨论】:
标签: c++ compression boost-iostreams