Я пытаюсь распаковать zip-файл с помощью zlib (без использования каких-либо расширений или сторонних разработчиков). Изначально src_len — 48756255, а dest_len — 49209890. Первый проход в цикле while проходит нормально: err равен Z_OK, и начинается второй проход. На втором проходе, независимо от того, что я делаю, я получаю Z_BUF_ERROR от надувания. stream.total_out на данный момент равен 49034460, так что осталось немного, но stream.avail_in на втором проходе равен 0. В любом случае, я ожидаю, что inflate даст мне Z_STREAM_END. Я действительно не знаю, что происходит, может кто-нибудь помочь?
void compression::uncompress2(char* dest, unsigned dest_len, char* src, unsigned src_len) {
TempAllocator ta;
z_stream_s stream = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stream.next_in = (Bytef*)src;
stream.avail_in = (uInt)src_len;
stream.next_out = (Bytef*)dest;
stream.avail_out = (uInt)dest_len;
stream.zalloc = zalloc;
stream.zfree = zfree;
stream.opaque = &ta;
// no header
int err = inflateInit2(&stream, -MAX_WBITS);
XENSURE(err == Z_OK);
bool done = false;
while (!done) {
stream.next_out = (Bytef*)(dest + stream.total_out);
stream.avail_out = dest_len - stream.total_out;
err = inflate(&stream, Z_SYNC_FLUSH);
if (err == Z_STREAM_END)
done = true;
else if (err != Z_OK) {
break;
}
}
err = inflateEnd(&stream);
XENSURE(err == Z_OK);
}