Pregunta

Estoy teniendo problemas para conseguir boost::iostreams del zlib filtro de ignorar gzip encabezados ...Parece que la configuración de zlib_param del default_noheader a true y, a continuación, llamar a zlib_decompressor() produce el 'data_error' (error en el encabezado incorrecto de verificación).Esto me dice zlib aún está esperando a encontrar los encabezados.Alguien ha conseguido boost::iostreams::zlib para descomprimir los datos sin los encabezados?Tengo que ser capaz de leer y descomprimir archivos/corrientes que no tienen los dos bytes de encabezado.Cualquier ayuda será muy apreciada.

He aquí una versión modificada del programa de ejemplo proporcionado por el boost::iostreams::zlib documentación:

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

Sé que mis datos de prueba no es malo;Escribí un pequeño programa para llamar gzread() en el archivo de prueba;que se ha descomprimido ...así que estoy confundido en cuanto a por qué esto no funciona.

Gracias de antemano.

-Hielo

¿Fue útil?

Solución

Yo creo que lo que quiero hacer es algo que se describe aquí que es para ajustar el window bits parámetro.

e.g

zlib_params p;
p.window_bits = 16 + MAX_WBITS;

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

MAX_WBITS se define en zlib.h creo.

Otros consejos

mucho simple, prueba esto:

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

enlace con zlib e incluya zlib.h Puede usar STDOUT en lugar de un archivo usando Fileno (STDOUT)

Simplemente use el boost::iostreams::gzip_decompressor para descomprimir archivos GZIP.

Por ejemplo:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top