如何解决http封包中gzip编码的html
2009-07-16 15:09
232 查看
gzip编码,最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。(摘在百度百科)。
废话少说,来进入正题吧。
大家都知道,在默认模式下,http协议中发送的网页的Html代码是经过gzip编码后传送的。那么我们怎么才能回复这段编码后的html呢?
大家可能都知道linux下有一个gzip命令。可以把文件压缩成gzip编码的格式,即*.gz
而对于文件的压缩和解压缩,可以采用zlib库中提供的各种接口来进行操作。但是这里问题来了。关于gzip编码的那些函数都带有gz开头的标示。而这些接口维护了一个名叫gz_stream的结构体。并且是针对文件FILE*操作的。
而我们要解决的问题是,我们把截取的封包中的gzip编码的内容拿出来,放到一个buffer中。那么怎么才能针对这个buffer中的数据应用这些接口呢?
我本来的想法是能不能在这些接口中找到专门对内存中的数据进行解码?
考虑这个问题,我看了这个库的源代码。后来放弃了。至于放弃的原因,可能是我意志力不够,或者不想看那些源代码了。总之,我看了一天,看的我头疼。
后来我就想个办法绕开这一思路,走个弯路。问题豁然开朗。
思路如下:
1. 把获取到的经过编码的数据保存到一个文件中。注意写文件的时候一定要以二进制方式。否则是不能解码的。
2. 应用zlib中的接口,gzopen(),gzread(),gzclose()即可完成解码的任务了。
我把这一过程简单封装起来,在VC2005下经过测试,仅提供参考:
废话少说,来进入正题吧。
大家都知道,在默认模式下,http协议中发送的网页的Html代码是经过gzip编码后传送的。那么我们怎么才能回复这段编码后的html呢?
大家可能都知道linux下有一个gzip命令。可以把文件压缩成gzip编码的格式,即*.gz
而对于文件的压缩和解压缩,可以采用zlib库中提供的各种接口来进行操作。但是这里问题来了。关于gzip编码的那些函数都带有gz开头的标示。而这些接口维护了一个名叫gz_stream的结构体。并且是针对文件FILE*操作的。
而我们要解决的问题是,我们把截取的封包中的gzip编码的内容拿出来,放到一个buffer中。那么怎么才能针对这个buffer中的数据应用这些接口呢?
我本来的想法是能不能在这些接口中找到专门对内存中的数据进行解码?
考虑这个问题,我看了这个库的源代码。后来放弃了。至于放弃的原因,可能是我意志力不够,或者不想看那些源代码了。总之,我看了一天,看的我头疼。
后来我就想个办法绕开这一思路,走个弯路。问题豁然开朗。
思路如下:
1. 把获取到的经过编码的数据保存到一个文件中。注意写文件的时候一定要以二进制方式。否则是不能解码的。
2. 应用zlib中的接口,gzopen(),gzread(),gzclose()即可完成解码的任务了。
我把这一过程简单封装起来,在VC2005下经过测试,仅提供参考:
// ~GzipParse.h #ifndef __GZIPPARSE_H_ #define __GZIPPARSE_H_ /* * 此类用于解码http协议中gzip编码的html数据数据 * 也可用于其他类似用途 */ class GzipParse { public: //sCompressedData压缩数据的buffer, //nLen sCompressedData的长度 GzipParse(char *sCompressedData,int nLen); ~GzipParse(); public: //调用时,请确保unCompressedData的长度足够长,能够容纳解码后的数据 //sUnCompressedData解码数据的buffer //nLen sUnCompressedData的长度 char *Decode(char *sUnCompressedData,int nLen); private: char *m_sCompressedData; int m_nLen; }; #endif // __GZIPPARSE_H_ // ~GzipParse.cpp #include "GzipParse.h" #include "zlib.h" #include <fstream> #ifdef WIN32 #pragma comment(lib,"zlib.lib") #endif using std::ofstream; using std::ios_base; GzipParse::GzipParse(char *sCompressedData,int nLen) { this->m_sCompressedData = sCompressedData; this->m_nLen = nLen; } GzipParse::~GzipParse() { } char * GzipParse::Decode(char *out,int nOutLen) { ofstream fout; fout.open("html.tmp",ios_base::out | ios_base::trunc | ios_base::binary ); fout.write(m_sCompressedData,m_nLen); fout.close(); gzFile file = gzopen("html.tmp","rb"); int nLength = gzread(file,out,nOutLen); gzclose(file); out[nLength] = '/0'; return out; } //~ testGzipParse.cpp #include "GzipParse.h" #include <iostream> using std::cout; using std::cin; using std::endl; int main() { char * sUnCompress = new char[100]; char sCompress[] = {0x1f,0x8b,0x08,0x08,0x8c,0x9f,0x5E,0x4A,0x00,0x03,0x67, 0x7a,0x69,0x70,0x2e,0x74,0x78,0x74,0x00,0x33,0x34,0x32, 0x36,0x32,0x31,0x1c,0x25,0x46,0x09,0x9a,0x12,0x5c,0x00, 0xb4,0xe9,0x50,0x7F,0x68,0x02,0x00,0x00}; GzipParse gzip(sCompress,sizeof sCompress); gzip.Decode(sUnCompress); cout << sUnCompress << endl; cin.get(); delete []sUnCompress; return 0; }
相关文章推荐
- 如何解决http封包中gzip编码的html
- 如何解决http封包中gzip编码的html
- 关于如何解决近期微赞或微擎有些模块提示不是官方安装的解决办法 http://bbs.517weixin.com/thread-1323-1-1.html
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- 请问如何解决WORD转HTML是出现的“内存或磁盘空间不足,无法显示或打印图片”这个问题?
- 批量删除记录时如何实现全选方法总结 (转)http://www.cnblogs.com/chenou/articles/1349646.html[Asp.net Ajax 控件]
- 彻底解决联想手机数据连接不能上网问题(无需恢复出厂设置) 本文来自移动叔叔论坛 ,详细出处请参考:http://bbs.ydss.cn/thread-201115-1-1.html
- 如何解决极少的css,多个html,却没有覆盖掉前一个人写的代码?
- HtmlAgilityPack HtmlWeb.Load() 不支持 gzip 的解决方法
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数 http://reportsoft.blog.hexun.com/75077561_d.html
- Java文件下载:如何编码文件名称以及如何设置HttpServletResponse
- 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题
- 如何解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题
- 通用的业务编码规则设计实现[转:http://www.cnblogs.com/xqin/p/3708367.html]
- IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求
- 如何解决JSP页面顶端报错 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- tomcat编码格式的设置/如何解决get()方式提交中文参数乱码的问题
- Tomcat的参数配置及一般问题的解决---http://www.blogjava.net/Steven-bot/archive/2011/10/08/360161.html
- 声明的xmlHttp对象在FF浏览器不可用的解决办法(http://hi.baidu.com/jinwb/blog/item/871998258f60556935a80f25.html)
- MYSQL数据库导入UTF8编码的SQL文件出现乱码如何解决