Domanda

Ho problemi a ottenere Boost :: Iostreams's Zlib Fill per ignorare le intestazioni di Gzip ... Sembra che l'impostazione del default_Noheader di configurazione di Zlib_Param_Noheader su true e quindi chiamare zlib_decompressor () produce l'errore "data_error" (controllo di intestazione errato).Questo mi dice che Zlib stia ancora aspettando di trovare intestazioni. Qualcuno ha ottenuto la boost :: iostreams :: zlib per decomprimere i dati senza intestazioni?Devo essere in grado di leggere e decomprimere file / flussi che non hanno l'intestazione a due byte.Qualsiasi assistenza sarà molto apprezzata.

Ecco una versione modificata del programma di esempio fornito da The Boost :: Iostreams :: Documentazione 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;
}
.

So che i miei dati del test non sono male;Ho scritto un piccolo programma per chiamare Gzread () nel file di test;È decompresso con successo ... quindi sono confuso sul perché questo non funziona.

Grazie in anticipo.

-ice

È stato utile?

Soluzione

Penso che cosa vuoi fare è qualcosa che è descritto Qui che è quello di regolare il parametro window bits.

E.G

zlib_params p;
p.window_bits = 16 + MAX_WBITS;

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

MAX_WBITS è definito in zlib.h Penso.

Altri suggerimenti

Molto semplice, prova questo:

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 con zlib e includi zlib.h È possibile utilizzare STDOUT invece di un file utilizzando Fileno (Stdout)

Basta usare il boost::iostreams::gzip_decompressor per decompressione dei file gzip.

Ad esempio:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top