5
votes

Can someone tell me which function I need to use in order to decompress a byte array that has been compressed with vb.net's gzipstream. I would like to use zlib.

I've included the zlib.h but I haven't been able to figure out what function(s) I should use.

4

4 Answers

8
votes

You can take a look at The Boost Iostreams Library:

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

std::ifstream file;
file.exceptions(std::ios::failbit | std::ios::badbit);
file.open(filename, std::ios_base::in | std::ios_base::binary);

boost::iostreams::filtering_stream<boost::iostreams::input> decompressor;
decompressor.push(boost::iostreams::gzip_decompressor());
decompressor.push(file);

And then to decompress line by line:

for(std::string line; getline(decompressor, line);) {
    // decompressed a line
}

Or entire file into an array:

std::vector<char> data(
      std::istreambuf_iterator<char>(decompressor)
    , std::istreambuf_iterator<char>()
    );
1
votes

You need to use inflateInit2() to request gzip decoding. Read the documentation in zlib.h.

There is a lot of sample code in the zlib distribution. Also take a look at this heavily documented example of zlib usage. You can modify that one to use inflateInit2() instead of inflateInit().

1
votes

Here is a C function that does the job with zlib:

int gzip_inflate(char *compr, int comprLen, char *uncompr, int uncomprLen)
{
    int err;
    z_stream d_stream; /* decompression stream */

    d_stream.zalloc = (alloc_func)0;
    d_stream.zfree = (free_func)0;
    d_stream.opaque = (voidpf)0;

    d_stream.next_in  = (unsigned char *)compr;
    d_stream.avail_in = comprLen;

    d_stream.next_out = (unsigned char *)uncompr;
    d_stream.avail_out = uncomprLen;

    err = inflateInit2(&d_stream, 16+MAX_WBITS);
    if (err != Z_OK) return err;

    while (err != Z_STREAM_END) err = inflate(&d_stream, Z_NO_FLUSH);

    err = inflateEnd(&d_stream);
    return err;
}

The uncompressed string is returned in uncompr. It's a null-terminated C string so you can do puts(uncompr). The function above only works if the output is text. I have tested it and it works.

-1
votes

Have a look at the zlib usage example. http://www.zlib.net/zpipe.c

The function that does the real work is inflate(), but you need inflateInit() etc.