ZLib Inflate () schlägt mit -3 Z_DATA_ERROR fehl

Ich versuche, eine Datei durch Aufrufen der Inflate-Funktion zu entpacken, aber mit Z_DATA_ERROR schlägt dies immer fehl, auch wenn ich das Beispielprogramm von der Website verwende. Ich denke, dass die Zip-Datei, die ich habe, möglicherweise nicht unterstützt wird. Ich habe ein Bild des Zip-Headers unten angehängt.

Und hier ist die Funktion, die ich geschrieben habe, um das Entpacken durchzuführen. Ich habe die ganze Datei auf einmal eingelesen (ca. 34KB) und an diese Funktion übergeben. Hinweis Ich habe versucht, die gesamte Zip-Datei mit dem Zip-Header zu übergeben sowie den Zip-Datei-Header zu überspringen und nur die komprimierten Daten zu übergeben. Beide schlagen mit Z_DATA_ERROR fehl, wenn inflate () aufgerufen wird.

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

Meine Frage ist also, ob der Typ der Zip-Datei, in der ich lese, von der ZLib-Funktion inflate () nicht unterstützt wird. Oder stimmt etwas mit meiner Funktion CHttpDownloader :: unzip () nicht? Danke für jede Hilfe :)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage