zLib und CHttpFile



  • Ich habe eine Webseite die gz-komprimiert übertragen wird und möchte diese mit zLib entpacken.Dazu habe ich das Beispiel von der zLib Seite umgebaut das es CFile-Zeiger statt File Zeigern annimmt und habe dann ein CHttpFile und ein CMemfile an die Funktion übergeben,aber ich kriege nur Z_DATA_ERROR zurück.Hat jemand eine Idee woran das liegen könnte?

    int inf(CFile *source, CFile *dest)
    {
        int ret;
        unsigned have;
        z_stream strm;
        unsigned char in[CHUNK];
        unsigned char out[CHUNK];
    
        /* allocate inflate state */
        strm.zalloc = Z_NULL;
        strm.zfree = Z_NULL;
        strm.opaque = Z_NULL;
        strm.avail_in = 0;
        strm.next_in = Z_NULL;
        ret = inflateInit(&strm);
        if (ret != Z_OK)
            return ret;
    
        /* decompress until deflate stream ends or end of file */
        do {
    		try
    		{
    		 strm.avail_in = source->Read(in, CHUNK);
    		}
            catch(CFileException ex) 
    		{
                (void)inflateEnd(&strm);
                return Z_ERRNO;
            }
            if (strm.avail_in == 0)
                break;
            strm.next_in = in;
    
            /* run inflate() on input until output buffer not full */
            do {
                strm.avail_out = CHUNK;
                strm.next_out = out;
                ret = inflate(&strm, Z_NO_FLUSH);
            /* state not clobbered */
                switch (ret) {
                case Z_NEED_DICT:
                    ret = Z_DATA_ERROR;     /* and fall through */
                case Z_DATA_ERROR:
                case Z_MEM_ERROR:
                    (void)inflateEnd(&strm);
                    return ret;
                }
                have = CHUNK - strm.avail_out;
    			try
    			{
    				dest->Write(out,have);
    			}
    			catch(CFileException ex) 
    			{
    				(void)inflateEnd(&strm);
    				return Z_ERRNO;
    			}
            } while (strm.avail_out == 0);
    
            /* done when inflate() says it's done */
        } while (ret != Z_STREAM_END);
    
        /* clean up and return */
        (void)inflateEnd(&strm);
        return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
    }
    


  • probier mal inflateInit2(&strm, -15);


Anmelden zum Antworten