2010-07-14 8 views
2

J'ai du mal à obtenir boost :: Le filtre zlib de iostreams ignore les en-têtes gzip ... Il semble que définir default_noheader de zlib_param sur true, puis appeler zlib_decompressor() produit l'erreur 'data_error' (vérification incorrecte de l'en-tête). Cela me dit que zlib s'attend toujours à trouver des en-têtes. Est-ce que quelqu'un a boosté :: iostreams :: zlib pour décompresser des données sans en-têtes? Je dois être capable de lire et de décompresser les fichiers/flux qui n'ont pas l'en-tête à deux octets. Toute aide sera grandement appréciée.boost :: iostreams :: zlib :: default_noheader semble être ignoré

est ici une version modifiée du programme d'échantillon fourni par le boost :: iostreams :: Documentation 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; 
} 

Je sais que mes données de test ne sont pas mauvais; J'ai écrit un petit programme pour appeler gzread() sur le fichier de test; il est décompressé avec succès ... donc je suis confus quant à savoir pourquoi cela ne fonctionne pas.

Merci d'avance.

-Glace

Répondre

0

Je pense que ce que vous voulez faire est quelque chose qui décrit here ce qui est de régler le paramètre window bits.

par exemple

zlib_params p; 
p.window_bits = 16 + MAX_WBITS; 

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

MAX_WBITS est défini dans zlib.h je crois.

0

Une grande partie simple, essayez ceci:

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

lien avec zlib et comprennent zlib.h Vous pouvez utiliser STDOUT au lieu d'un fichier à l'aide fileno (stdout)

0

Il suffit d'utiliser le boost::iostreams::gzip_decompressor pour décomprimer fichiers gzip.

Par exemple:

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