views:

68

answers:

2

Hi stackoverflow,

I'm having trouble getting boost::iostreams's zlib filter to ignore gzip headers ... It seems that setting zlib_param's default_noheader to true and then calling zlib_decompressor() produces the 'data_error' error (incorrect header check). This tells me zlib is still expecting to find headers. Has anyone gotten boost::iostreams::zlib to decompress data without headers? I need to be able to read and decompress files/streams that do not have the two-byte header. Any assistance will be greatly appreciated.

Here's a modified version of the sample program provided by the boost::iostreams::zlib documentation:

#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;
}

I know my test data is not bad; I wrote a small program to call gzread() on the test file; it is successfully decompressed ... so I'm confused as to why this does not work.

Thanks in advance.

-Ice

A: 

I think what you want to do is something that's described here which is to adjust the window bits parameter.

e.g

zlib_params p;
p.window_bits = 16 + MAX_WBITS;

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

MAX_WBITS is defined in zlib.h I think.

miedwar
A: 

Much simple, try this:

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 );

Link with zlib and include zlib.h You can use STDOUT instead of a file by using fileno( stdout )

harry