首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

zlib解压不成功,该如何处理

2013-09-11 
zlib解压不成功1F 8B 08 00 00 00 00 00 04 00 0D 0A 64 38 0D 0A 24 CF 41 72 82 30 14 80 E1 AB B8 82 1

zlib解压不成功
1F 8B 08 00 00 00 00 00 04 00 0D 0A 64 38 0D 0A 24 CF 41 72 82 30 14 80 E1 AB B8 82 1D BC F0 92 C8 6B 8D 1D 48 C4 61 DD 13 04 0C 48 AD 24 03 D1 A1 B7 EF B4 EE FE F9 76 FF 61 ED 97 29 C4 5D FC 09 4E A5 D1 6D 31 FF B2 4F FB D2 F4 F8 ED 7B 1B 27 3F 67 D7 C5 0D 3B 95 5E 63 0C 6F 79 3E DA BB 5B B3 DB 63 F4 8F AC F7 F7 FC EC A3 3F FF 9B 5D C3 F6 F1 97 ED 45 09 4C 3E DD F2 9C 7A D7 1A 45 94 74 7E 8B FE E6 66 C5 34 89 52 17 48 8D 26 6C 50 57 24 35 0A 92 00 0C 84 D0 04 4D 5D 4A 28 99 61 08 50 9D A0 2A CC A9 2A C1 80 94 05 E7 06 8D DE 57 0D EE 65 5D 43 4D 68 8A 64 9D C6 59 71 E0 24 06 4B C8 89 77 9D 83 41 0A 29 08 07 2E 2C 2F 2D EB 92 30 5D 14 43 4A DF 0F F9 EB EF F8 3B 00 10 15 3E 0D FE 00 00 00 0D 0A 30 0D 0A 0D 0A

上面这段是我从服务器http返回包中截取的一段,以1F 8B开头,所以我认为是gzip压缩包,但用zlib不能解压,运行到inflate方法返回Z_DATA_ERROR,以前遇到过的gzip数据都能用此方法正确解压,并且浏览器可以正常解压出上面这段数据。请问为什么会出数据格式错误?对zlib不太了解,请高手指教

/////////方法代码///////////
char* ZlibTool::inflate_read(unsigned char *source,int len,int gzip)
{
char *dest = NULL;
int ret;
unsigned have;
z_stream strm;
unsigned char out[1024];
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, 47);
else
ret = inflateInit(&strm);

if (ret != Z_OK)
//return ret;
return NULL;

strm.avail_in = len;
strm.next_in = (Byte*)source;

/* run inflate() on input until output buffer not full */


do {
strm.avail_out = 1024;
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;
return NULL;
}
have = 1024 - strm.avail_out;
totalsize += have;
dest = (char*)realloc(dest,totalsize);
memcpy(dest + totalsize - have,out,have);
 //printf("UnCompressed String:%s",out);

} while (strm.avail_out == 0);

/* clean up and return */
(void)inflateEnd(&strm);
//return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
return dest;
}
////////////////http头///////////////////
HTTP Response:                          HTTP/1.1 200 OK [54/17]
Cache-Control:  private[71/24]
Date:                                   Sun, 08 Sep 2013 07:40:09 GMT [95/37]
Content-Type:                           text/html; charset=utf-8 [132/40]
Server:                                 Microsoft-IIS/6.0 [172/27]
X-Powered-By:                           ASP.NET [199/23]
X-AspNet-Version:                       2.0.50727 [222/29]
Content-Encoding:                       gzip [251/24]
Vary:                                   Accept-Encoding [275/23]
Transfer-Encoding:                      chunked [298/30]


Binary Data:                            242 Bytes  [328/242]
  
///////Binary Data///////
61 0D 0A 1F 8B 08 00 00 00 00 00 04 00 0D 0A 64 38 0D 0A 24 CF 41 72 82 30 14 80 E1 AB B8 82 1D BC F0 92 C8 6B 8D 1D 48 C4 61 DD 13 04 0C 48 AD 24 03 D1 A1 B7 EF B4 EE FE F9 76 FF 61 ED 97 29 C4 5D FC 09 4E A5 D1 6D 31 FF B2 4F FB D2 F4 F8 ED 7B 1B 27 3F 67 D7 C5 0D 3B 95 5E 63 0C 6F 79 3E DA BB 5B B3 DB 63 F4 8F AC F7 F7 FC EC A3 3F FF 9B 5D C3 F6 F1 97 ED 45 09 4C 3E DD F2 9C 7A D7 1A 45 94 74 7E 8B FE E6 66 C5 34 89 52 17 48 8D 26 6C 50 57 24 35 0A 92 00 0C 84 D0 04 4D 5D 4A 28 99 61 08 50 9D A0 2A CC A9 2A C1 80 94 05 E7 06 8D DE 57 0D EE 65 5D 43 4D 68 8A 64 9D C6 59 71 E0 24 06 4B C8 89 77 9D 83 41 0A 29 08 07 2E 2C 2F 2D EB 92 30 5D 14 43 4A DF 0F F9 EB EF F8 3B 00 10 15 3E 0D FE 00 00 00 0D 0A 30 0D 0A 0D 0A zlib gzip
[解决办法]
注意这里:

Transfer-Encoding: chunked [298/30]

所以body部分是chunked的,需要先解开这一部分才行

具体是:
“十六进制包长+\r\n+报文包+\r\n  为一个传输单元
0+\r\n+\r\n 当遇到这种空传输单元时结束”



到你这个例子:

61 0D 0A 1F 8B 08 00 00 00 00 00 04 00 0D 0A
"a\r\n -----------data length = 10(a)-------------\r\n"

64 38 0D 0A 24 CF 41 72 82 30 14 80 E1 AB B8 82 1D BC F0 92 C8 6B 8D 1D 48 C4 61 DD 13 04 0C 48 AD 24 03 D1 A1 B7 EF B4 EE FE F9 76 FF 61 ED 97 29 C4 5D FC 09 4E A5 D1 6D 31 FF B2 4F FB D2 F4 F8 ED 7B 1B 27 3F 67 D7 C5 0D 3B 95 5E 63 0C 6F 79 3E DA BB 5B B3 DB 63 F4 8F AC F7 F7 FC EC A3 3F FF 9B 5D C3 F6 F1 97 ED 45 09 4C 3E DD F2 9C 7A D7 1A 45 94 74 7E 8B FE E6 66 C5 34 89 52 17 48 8D 26 6C 50 57 24 35 0A 92 00 0C 84 D0 04 4D 5D 4A 28 99 61 08 50 9D A0 2A CC A9 2A C1 80 94 05 E7 06 8D DE 57 0D EE 65 5D 43 4D 68 8A 64 9D C6 59 71 E0 24 06 4B C8 89 77 9D 83 41 0A 29 08 07 2E 2C 2F 2D EB 92 30 5D 14 43 4A DF 0F F9 EB EF F8 3B 00 10 15 3E 0D FE 00 00 00 0D 0A

"d8\r\n-------------------data len = 216(d8)---------------\r\n"

30 0D 0A 0D 0A
"0\r\n\r\n"

热点排行