Frage

Ich habe Probleme damit, den Zlib-Filter von boost::iostreams dazu zu bringen, GZIP-Header zu ignorieren ...Es scheint, dass das Setzen von „default_noheader“ von zlib_param auf „true“ und das anschließende Aufrufen von „zlib_decompressor()“ den Fehler „data_error“ (falsche Headerprüfung) erzeugt.Das sagt mir, dass zlib immer noch darauf wartet, Header zu finden.Hat jemand boost::iostreams::zlib bekommen, um Daten ohne Header zu dekomprimieren?Ich muss in der Lage sein, Dateien/Streams zu lesen und zu dekomprimieren, die keinen Zwei-Byte-Header haben.Jede Hilfe wird sehr geschätzt.

Hier ist eine modifizierte Version des Beispielprogramms, das in der Dokumentation zu boost::iostreams::zlib bereitgestellt wird:

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

Ich weiß, dass meine Testdaten nicht schlecht sind;Ich habe ein kleines Programm geschrieben, um gzread() für die Testdatei aufzurufen;es wurde erfolgreich dekomprimiert ...Deshalb bin ich verwirrt, warum das nicht funktioniert.

Dank im Voraus.

-Eis

War es hilfreich?

Lösung

Ich denke, was Sie tun möchten, ist etwas, das beschrieben wird Hier Das heißt, das anzupassen window bits Parameter.

z.B

zlib_params p;
p.window_bits = 16 + MAX_WBITS;

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

MAX_WBITS ist in zlib.h definiert, denke ich.

Andere Tipps

viel einfach, probiere das:

generasacodicetagpre.

link mit zlib und beinhalten zlib.h Sie können Stdout anstelle einer Datei mithilfe von Dateien (stdout) verwenden

verwenden

Verwenden Sie einfach das boost::iostreams::gzip_decompressor Zum Dekomprimieren von GZIP-Dateien.

Beispiel:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top