ZLib Inflate () falla con -3 Z_DATA_ERROR

Estoy intentando descomprimir un archivo llamando a la función de inflar, pero siempre falla con Z_DATA_ERROR incluso cuando uso el programa de ejemplo del sitio web. Estoy pensando que tal vez el archivo zip que tengo no es compatible. He adjuntado una imagen del encabezado zip abajo.

Y aquí está la función que escribí para realizar la descompresión. Leí todo el archivo a la vez (aproximadamente 34 KB) y lo puse en esta función. Nota: he intentado pasar todo el archivo zip con el encabezado zip, así como saltarme el encabezado del archivo zip y solo pasar los datos comprimidos, ambos fallan con Z_DATA_ERROR cuando se llama inflate ().

int CHttpDownloader::unzip(unsigned char * pDest, unsigned long * ulDestLen, unsigned char *  pSource, int iSourceLen)
{
int ret = 0;
unsigned int uiUncompressedBytes = 0; // Number of uncompressed bytes returned from inflate() function
unsigned char * pPositionDestBuffer = pDest; // Current position in dest buffer
unsigned char * pLastSource = &pSource[iSourceLen]; // Last position in source buffer
z_stream strm;

// Skip over local file header
SLocalFileHeader * header = (SLocalFileHeader *) pSource;
pSource += sizeof(SLocalFileHeader) + header->sFileNameLen + header->sExtraFieldLen;


// We should now be at the beginning of the stream data
/* 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 = inflateInit2(&strm, 16+MAX_WBITS);
if (ret != Z_OK)
{
return -1;
}

// Uncompress the data
strm.avail_in = header->iCompressedSize; //iSourceLen;
strm.next_in = pSource;

do {
strm.avail_out = *ulDestLen;
strm.next_out = pPositionDestBuffer;
ret = inflate(&strm, Z_NO_FLUSH);
assert(ret != Z_STREAM_ERROR);  /* 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 -2;
}
uiUncompressedBytes = *ulDestLen - strm.avail_out;
*ulDestLen -= uiUncompressedBytes; // ulDestSize holds number of free/empty bytes in buffer
pPositionDestBuffer += uiUncompressedBytes;
} while (strm.avail_out == 0);

// Close the decompression stream
inflateEnd(&strm);
ASSERT(ret == Z_STREAM_END);

return 0;
}

Entonces, mi pregunta es: ¿el tipo de archivo zip que estoy leyendo no es compatible con la función inflate () de ZLib? ¿O hay algún problema con mi función CHttpDownloader :: unzip ()? Gracias por cualquier ayuda :)

Respuestas a la pregunta(2)

Su respuesta a la pregunta