问题:
一进入问题,问题的答案就马上出现在眼前!
寻找gzip
获取网页数据返回的编码类型为gzip。 我该怎么解冻?
获取HTTP标头?
如何通过vb获取网络上的xml文件并分析其内容
关于GZIP的解码
如何求解gzip的压缩
Wininet是否可以进行Gzip的http传输? 特别是开机自检的情况! 怎么能实现呢?
关于以GZIP格式解压缩HTTP包的问题,使用ZLIB为什么必须先保存文件,内存解压缩有错误
无法获取$_SERVER['HTTP_REFERER']
关于GZIP的问题,用高分解决!
.
等等都是关于gzip解压缩的
问题:
提取并解压缩http的gzip内容。
关键点:
提取http数据包的内容,主要是gzip格式的
2数据包重组
3将gzip数据解压缩到内存中
这两个星期,都是在网上来的,在网友的帮助下,非常感谢。 特写此语句,以防止此问题继续困扰后续的un_gziper。
1提取数据包内存:
重要的是找到gzip内存的开始位置和确定gzip内容大小的方法
开始位置:“内容编码: gziprnrn”
gip大小:“Content-Length:”后面是
两个分组的重组,一般的网页内容很少能容纳在一个分组中,所以必须进行gzip后在多个分组中进行转发
关键是:
get请求分组的ack和seq与http返回分组的ack、seq密切相关:
举例说明:
获取请求: ack=0,seq=0
http1:seq=0,ack=584
http2: seq=1420,ack=584
.
从简单的分析说明可以看出,我们的算法设计:
首先得到get请求的ack,返回的数据包的seq等于这个值。 同时记下这个数据包的ack。 之后进行分包发送的http的数据包的ack都是这个值。 这是关键之一,同时也是整合
Content-Length提供了gzip的所有内容。
这样,原始数据的提取就完成了。 我该怎么解冻?
3解冻gzip
完成以上1、2个步骤后,可以将内容保存到文件中,并使用gzip命令打开,验证了数据的完整性。
然后,我采用了zlib提供的uncompress函数。 和大多数网友一样,我犯了一个不经常阅读zlib文档的致命错误。这导致了无谓的识别!
实际上,zlib格式和gzib格式有所不同,但uncompress用于解压缩zlib格式的文件。 因此,使用compress函数压缩的数据可以直接在内存中用uncompress函数解压缩,出现无法解压缩gzip数据的问题
然后,我们测试了zlib包中的example示例,对zlib有了一点了解,应该用inflate关系函数进行解压缩!
当然,这样就出了问题。 格式错误。
之后在网上看到的帖子: gzip格式在inflate函数中还不行,必须使用inflateinit2(strm,47 )。 ! !
解决问题!
在这里一边借用那个网友的源代码,一边感谢他!
intinflate_read(char*source,int len,char **dest,int gzip ) ) ) ) ) )。
{
int ret;
无符号硬盘;
z_stream strm;
无符号char out [ chunk ];
int总大小=0;
/* allocate基础设施状态* /
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 )
返回ret;
strm.avail_in=len;
strm.next_in=source;
/*运行基础设施(oninputuntiloutputbuffernotfull ) /
do {
strm.avail_out=CHUNK;
strm.next_out=out;
ret=inflate(strm,Z_NO_FLUSH );
资产(ret!=Z_STREAM_ERROR;/*状态不关闭* /
交换机(ret ) {
case Z_NEED_DICT:
ret=Z_DATA_ERROR; /* and fall through */
case Z_DATA_ERROR:
case Z_MEM_ERROR:
基础设施结束(strm;
返回ret;
}
have=CHUNK - strm.avail_out;
总大小=have;
*dest=realloc(dest,totalsize );
memcpy(*desttotalsize-have,out,have );
}while(strm.avail_out==0);
/* clean up和return * /
(语音)基础设施结束) strm;
return ret==Z_STREAM_END? Z_OK : Z_DATA_ERROR;
}
后记,这个过程很痛苦,但很幸福!
在此,我向所有关心gzip解压缩问题的网友提出一个小建议:
我们遇到了zlib的文档是英语,各个网友翻译了开头的一部分,但这还不够的问题
所以,有兴趣的朋友想一起帮助zlib翻译文档成为中文!
感兴趣的人请加上我!
阅读(2738 ) |评论(0) |转发)0|