2010-07-14 241 views
2

我無法獲得boost :: iostreams的zlib過濾器忽略gzip頭......似乎將zlib_param的default_noheader設置爲true,然後調用zlib_decompressor()產生'data_error'錯誤(錯誤的頭部檢查)。這告訴我zlib仍然期望找到標題。 有沒有人獲得boost :: iostreams :: zlib解壓縮數據而不用頭文件?我需要能夠讀取和解壓縮沒有雙字節標題的文件/流。任何援助將不勝感激。boost :: iostreams :: zlib :: default_noheader似乎被忽略

這裏是由升壓::提供的樣本程序的修改版本的iostream :: zlib的文檔:

#include <fstream> 
#include <iostream> 
#include <boost/iostreams/filtering_streambuf.hpp> 
#include <boost/iostreams/copy.hpp> 
#include <boost/iostreams/filter/zlib.hpp> 

int main(int argc, char** argv) 
{ 
    using namespace std; 
    using namespace boost::iostreams; 

    ifstream ifs(argv[1]); 
    ofstream ofs("out"); 
    boost::iostreams::filtering_istreambuf in; 
    zlib_params p(
      zlib::default_compression, 
      zlib::deflated, 
      zlib::default_window_bits, 
      zlib::default_mem_level, 
      zlib::default_strategy, 
      true 
    ); 

    try 
    { 
     in.push(zlib_decompressor(p)); 
     in.push(ifs); 
     boost::iostreams::copy(in, ofs); 
     ofs.close(); 
     ifs.close(); 
    } 
    catch(zlib_error& e) 
    { 
     cout << "zlib_error num: " << e.error() << endl; 
    } 
    return 0; 
} 

我知道我的測試數據不壞;我寫了一個小程序在測試文件中調用gzread();它成功解壓縮...所以我很困惑,爲什麼這不起作用。

在此先感謝。

-ICE

回答

0

我想你想要做的是,定律描述here這是調整window bits參數的東西。

e.g

zlib_params p; 
p.window_bits = 16 + MAX_WBITS; 

in.push(zlib_decompressor(p)); 
in.push(ifs); 

MAX_WBITS在zlib.h定義,我認爲。

0

簡單得多,試試這個:

FILE* fp = fopen("abc.gz", "w+"); 
int dupfd = dup(fileno(fp)); 
int zfp = gzdopen(dupfd, "ab") 
gzwrite(zfp, YOUR_DATA, YOUR_DATA_LEN); 
gzclose(zfp); 
fclose(fp); 

與zlib的鏈接,包括zlib.h 可以使用的fileno(標準輸出),而不是使用一個文件STDOUT

0

只需使用boost::iostreams::gzip_decompressor用於解gzip文件。

例如:

#include <boost/iostreams/filter/gzip.hpp> 
#include <boost/iostreams/device/file.hpp> 
#include <boost/iostreams/filtering_stream.hpp> 

// ... 

boost::iostreams::filtering_istream stream; 
stream.push(boost::iostreams::gzip_decompressor()); 
ifstream file(filename, std::ios_base::in | std::ios_base::binary); 
stream.push(file);