Problem bei Dekompression von GZIP-Dateien mit inflate() aus ZLIB



  • Hallo,

    ich hab mein Problem mal in dieses Forum gepostet, weil ich den BCB1 benutze.
    Ich möchte über HTTP übertragene gzip-komprimierte Dateien entpacken. Das ganze versuche ich jetzt mit zlib zu lösen (habe noch nie zuvor versucht, eine DLL zu benutzen, vielleicht mache ich da etwas falsch).
    inflate(), das eigentlich laut Manual auch gzip-Dateien entpacken können soll, gibt immer nur Z_DATA_ERROR zurück.
    Hier den Code, den ich benutze, vielleicht sieht jemand auf Anhieb, was ich falsch mache:

    void* ZLIBH=LoadLibrary("zlib1.dll");
    FARPROC InflateR,InflateInitR,InflateEndR,VersionR;
    InflateR=GetProcAddress(ZLIBH,"inflate");
    InflateInitR=GetProcAddress(ZLIBH,"inflateInit_");
    InflateEndR=GetProcAddress(ZLIBH,"inflateEnd");
    VersionR=GetProcAddress(ZLIBH,"zlibVersion");
    assert(InflateR!=NULL);
    assert(InflateInitR!=NULL);
    assert(InflateEndR!=NULL);
    assert(VersionR!=NULL);
    int(*Inflate)(z_streamp stream,int flush)=(int(*)(z_streamp,int))InflateR;
    int(*InflateInit)(z_streamp stream,char* Version,int StreamSize)=(int(*)(z_streamp,char*,int))InflateInitR;
    int(*InflateEnd)(z_streamp stream)=(int(*)(z_streamp))InflateEndR;
    char*(*Version)()=(char*(*)())VersionR;
    char* VerStr=Version();
    assert(String(VerStr)==String(ZLIB_VERSION));
    
    const unsigned long DestBufLen=100000;
    const unsigned long SrcBufLen=100000;
    ubyte* DestBuf=new ubyte[DestBufLen];
    ubyte* SrcBuf=new ubyte[SrcBufLen];
    
    int SrcLen;
    //[...]
    //SrcBuf erhält hier den Inhalt einer mit gzip erstellten Testdatei
    //SrcLen enthält die Größe der Datei
    //[...]
    
    z_stream strm;
    strm.zalloc=Z_NULL;
    strm.zfree=Z_NULL;
    strm.opaque=Z_NULL;
    strm.avail_in=SrcLen;
    strm.next_in=SrcBuf;
    strm.avail_out=DestBufLen;
    strm.next_out=DestBuf;
    int InflateInitResult=InflateInit(&strm,ZLIB_VERSION,sizeof(z_stream));
    int InflateResult=Inflate(&strm,Z_FINISH);
    InflateEnd(&strm);
    
    delete[] SrcBuf;
    delete[] DestBuf;
    FreeLibrary(ZLIBH);
    

    Was stimmt da nicht? Wäre froh, wenn mir jemand auf die Sprünge helfen könnte.



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ist wichtig ._.



  • Debugger. f'`8k



  • helper schrieb:

    Debugger. f'`8k

    Wie bitte?

    Ich hab mal ausprobiert, eine Datei zu dekomprimieren, die ich vorher mit deflate() komprimiert habe... das hat auch funktioniert. Versuche ich das aber mit einer gzip-Datei, kommt Z_DATA_ERROR. Ich hab auch mal versucht inflateSync() aufzurufen, auch das gibt aber nur Z_DATA_ERROR zurück.

    Der folgende Abschnitt sagt doch, dass es auch mit gzip-Dateien gehen sollte. Oder habe ich da etwas falsch verstanden?

    inflate() will decompress and check either zlib-wrapped or gzip-wrapped
    deflate data. The header type is detected automatically. Any information
    contained in the gzip header is not retained, so applications that need that
    information should instead use raw inflate, see inflateInit2() below, or
    inflateBack() and perform their own processing of the gzip header and
    trailer.



  • inflateInit2(&strm, MAX_WBITS + 16);
    


  • In Boost (genauer: Boost.Iostreams) gibt es bequemere Wrapper um zlib und libzip2, vielleicht würde das ja einiges an Mühe sparen.


Anmelden zum Antworten