|
楼主 |
发表于 2007-3-19 14:31:03
|
显示全部楼层
我看zlib的FAQ上面说解压缩gzip格式只要用inflateInit2就可以了,但是我试了一下发现程序报Z_DATA_ERROR,不知道为什么.下面是解压缩函数,它根据gzip参数来判断是用解压缩gzip还是解压缩deflate,大家看看有什么需要修改的吗?
- int inflate_read(char *source,int len,char **dest,int gzip) {
- int ret;
- unsigned have;
- z_stream strm;
- unsigned char out[CHUNK];
- int totalsize = 0;
- /* allocate inflate state */
- strm.zalloc = Z_NULL;
- strm.zfree = Z_NULL;
- strm.opaque = Z_NULL;
- strm.avail_in = 0;
- strm.next_in = Z_NULL;
-
- if(gzip)
- ret = inflateInit2(&strm, 15);
- else
- ret = inflateInit(&strm);
-
- if (ret != Z_OK)
- return ret;
- strm.avail_in = len;
- strm.next_in = source;
- /* run inflate() on input until output buffer not full */
- do {
- strm.avail_out = CHUNK;
- strm.next_out = out;
- 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:
- inflateEnd(&strm);
- return ret;
- }
- have = CHUNK - strm.avail_out;
- totalsize += have;
- *dest = realloc(*dest,totalsize);
- memcpy(*dest + totalsize - have,out,have);
- } while (strm.avail_out == 0);
- /* clean up and return */
- (void)inflateEnd(&strm);
- return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
- }
复制代码 |
|