当前位置: 技术问答>linux和unix
如何提取http数据包里面被压缩的gzip内容
来源: 互联网 发布时间:2016-05-05
本文导语: 抓取了http数据包,想提取里面的http网页的title,发现有的数据包里面的字段是被压缩成为了gzip格式的数据,当然我已经得到了这部分数据,但是问题是我改如何解压呢?搜了半天,发现对这个问题关注的人还真不少...
抓取了http数据包,想提取里面的http网页的title,发现有的数据包里面的字段是被压缩成为了gzip格式的数据,当然我已经得到了这部分数据,但是问题是我改如何解压呢?搜了半天,发现对这个问题关注的人还真不少,但是都没有一个提取完全的解决方案。
关键点说明:
1 这是抓取数据获取内容,而不是作为客服端发送请求到服务器端得到数据
2 难点是有没有gzip库函数供我直接调用,要求是可以在内存中对gzip数据进行直接的解压,而不是保存为gzip文件,然后再解压
3 正在参考wireshark的源代码,里面有关于gzip解压的相关代码,需要一点时间。
持续研究中,直到完全解决
希望得到大家的帮助,谢谢!
关键点说明:
1 这是抓取数据获取内容,而不是作为客服端发送请求到服务器端得到数据
2 难点是有没有gzip库函数供我直接调用,要求是可以在内存中对gzip数据进行直接的解压,而不是保存为gzip文件,然后再解压
3 正在参考wireshark的源代码,里面有关于gzip解压的相关代码,需要一点时间。
持续研究中,直到完全解决
希望得到大家的帮助,谢谢!
|
有现成的gzip库叫 zlib。
可以使用接口:
gzFile gzdopen (int fd, const char *mode);//由文件描述符打开文件
char * gzgets (gzFile file, char *buf, int len);
索性全贴了吧,可能还有人需要,也可以直接G00GLE:zlib 1.1.4 手册
----------------------------------------------
-----------------实用函数
------压缩与解压-------
int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
int compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level);
int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
------压缩文件的读写----
typedef voidp gzFile;
gzFile gzopen (const char *path, const char *mode);//由路径打开文件
gzFile gzdopen (int fd, const char *mode);//由文件描述符打开文件
int gzsetparams (gzFile file, int level, int strategy);//设置压缩参数
int gzread (gzFile file, voidp buf, unsigned len);//从 file 中读取长度为len *4 个字节到buf
int gzwrite (gzFile file, const voidp buf, unsigned len); //从buf中取len *4 个字节写到文件 file.
int VA gzprintf (gzFile file, const char *format, ...);//由压缩文件描述符直接输出文件内容,格式化输出到file。
int gzputs (gzFile file, const char *s);//由压缩文件描述符中读取串,并输出到file。
char * gzgets (gzFile file, char *buf, int len);
int gzputc (gzFile file, int c);
int gzgetc (gzFile file);
int gzflush (gzFile file, int flush);
z_off_t gzseek (gzFile file, z_off_t offset, int whence);
z_off_t gztell (gzFile file);
int gzrewind (gzFile file);
int gzeof (gzFile file);
int gzclose (gzFile file);
const char * gzerror (gzFile file, int *errnum);
--------基本函数:
const char * zlibVersion (void);
int deflateInit (z_streamp strm, int level);
int deflate (z_streamp strm, int flush);
int deflateEnd (z_streamp strm);
int inflateInit (z_streamp strm);
int inflate (z_streamp strm, int flush);
int inflateEnd (z_streamp strm);
---------高级函数:
int deflateInit2 (z_streamp strm,
int deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength);
int deflateCopy (z_streamp dest, z_streamp source);
int deflateReset (z_streamp strm);
int deflateParams (z_streamp strm, int level, int strategy);
int inflateInit2 (z_streamp strm, int windowBits);
int inflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength);
int inflateSync (z_streamp strm);
int inflateReset (z_streamp strm);
--------校验函数
uLong adler32 (uLong adler, const Bytef *buf, uInt len);
uLong crc32 (uLong crc, const Bytef *buf, uInt len);
可以使用接口:
gzFile gzdopen (int fd, const char *mode);//由文件描述符打开文件
char * gzgets (gzFile file, char *buf, int len);
索性全贴了吧,可能还有人需要,也可以直接G00GLE:zlib 1.1.4 手册
----------------------------------------------
-----------------实用函数
------压缩与解压-------
int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
int compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level);
int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
------压缩文件的读写----
typedef voidp gzFile;
gzFile gzopen (const char *path, const char *mode);//由路径打开文件
gzFile gzdopen (int fd, const char *mode);//由文件描述符打开文件
int gzsetparams (gzFile file, int level, int strategy);//设置压缩参数
int gzread (gzFile file, voidp buf, unsigned len);//从 file 中读取长度为len *4 个字节到buf
int gzwrite (gzFile file, const voidp buf, unsigned len); //从buf中取len *4 个字节写到文件 file.
int VA gzprintf (gzFile file, const char *format, ...);//由压缩文件描述符直接输出文件内容,格式化输出到file。
int gzputs (gzFile file, const char *s);//由压缩文件描述符中读取串,并输出到file。
char * gzgets (gzFile file, char *buf, int len);
int gzputc (gzFile file, int c);
int gzgetc (gzFile file);
int gzflush (gzFile file, int flush);
z_off_t gzseek (gzFile file, z_off_t offset, int whence);
z_off_t gztell (gzFile file);
int gzrewind (gzFile file);
int gzeof (gzFile file);
int gzclose (gzFile file);
const char * gzerror (gzFile file, int *errnum);
--------基本函数:
const char * zlibVersion (void);
int deflateInit (z_streamp strm, int level);
int deflate (z_streamp strm, int flush);
int deflateEnd (z_streamp strm);
int inflateInit (z_streamp strm);
int inflate (z_streamp strm, int flush);
int inflateEnd (z_streamp strm);
---------高级函数:
int deflateInit2 (z_streamp strm,
int deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength);
int deflateCopy (z_streamp dest, z_streamp source);
int deflateReset (z_streamp strm);
int deflateParams (z_streamp strm, int level, int strategy);
int inflateInit2 (z_streamp strm, int windowBits);
int inflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength);
int inflateSync (z_streamp strm);
int inflateReset (z_streamp strm);
--------校验函数
uLong adler32 (uLong adler, const Bytef *buf, uInt len);
uLong crc32 (uLong crc, const Bytef *buf, uInt len);
|
有直接读 压缩 文件的 函数...
|
http://www.codeguru.com/Cpp/Cpp/algorithms/compression/article.php/c5125/
直接在内存中解压
直接在内存中解压
|
gzip提供源代码,分析它的应该比wireshark要有效,而且可以直接把头和库文件拿过来进行调用。