码迷,mamicode.com
首页 > 其他好文 > 详细

【毕业设计日记-4月】gzip格式解压

时间:2016-04-19 12:08:05      阅读:465      评论:0      收藏:0      [点我收藏+]

标签:

之前很困惑的一个问题,这两天也倒腾出来了,就是wireshark分析出来的这个

技术分享

↑  ①Frame   ↑②De-chunked entity body  ↑③Uncompressed entity body

这三部分的关系是啥?

网上也找不到,还是请教了师兄师姐,才知道①是报文的所有内容,②是①中HTTP报文后面压缩的内容,③就是这部分压缩内容解压后的内容,也就是msgContent等等等这些需要的内容,所以我现在要做的就是截获报文之后对这部分内容进行解压(然后再提取msgContent的内容进行解密,这个之前已经做过了,只是需要整合一下了)。

技术分享

1F 8B 表示采用gzip压缩格式。

在网上找了一个解压的程序,在VS里跑了一下报错,稍微修改了一下,然后提示

技术分享

然后在网上看了一下,要自己去编译生成这个lib文件

技术分享

 

于是找到这个sln文件,打开,选中zlibstat.lib,重新生成解决方案,会在/x86/ZlibStatDebug文件目录下找到生成的zlibstat.lib库文件,然后按以下步骤:

1. 包含头文件

    属性--C/C++--常规--附加包含目录(添加包含.h文件的目录,也就是C:/zlib-1.2.8)

2. 定义宏

    属性--C/C++--预处理器--预处理器定义:添加 ZLIB_WINAPI;ASMV;ASMINF

3. 项目包含.lib文件所在的目录:

    属性--链接器--常规--附加库目录(添加C:/zlib-1.2.8/contirb/vstudio/vc10/x86/ZlibStatDebug)

4. 项目包含.lib文件

    属性--链接器--输入--附加依赖项(zlibstat.lib

5. 项目代码中 #include "zlib.h"

程序就可以正常运行啦

技术分享

下一步就是把这些一步步整合起来,放在一个程序里。

附上解压使用的测试程序:

 

 1 // gzip1.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 
 6 
 7 #ifndef GZIP_H
 8 #define GZIP_H
 9 
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include "zlib.h"
13 
14 /* Uncompress gzip data */
15 /* zdata 原数据 nzdata 原数据长度 data 解压后数据 ndata 解压后长度 */
16 int gzdecompress(Bytef *zdata, uLong nzdata,
17     Bytef *data, uLong ndata)
18 {
19     int err = 0;
20     z_stream d_stream = { 0 }; /* decompression stream */
21     static char dummy_head[2] = {
22         0x8 + 0x7 * 0x10,
23         (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
24     };
25     d_stream.zalloc = NULL;
26     d_stream.zfree = NULL;
27     d_stream.opaque = NULL;
28     d_stream.next_in = zdata;
29     d_stream.avail_in = 0;
30     d_stream.next_out = data;
31     //只有设置为MAX_WBITS + 16才能在解压带header和trailer的文本
32     if (inflateInit2(&d_stream, MAX_WBITS + 16) != Z_OK) return -1;
33     //if(inflateInit2(&d_stream, 47) != Z_OK) return -1;
34     while (d_stream.total_out < ndata && d_stream.total_in < nzdata) {
35         d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
36         if ((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
37         if (err != Z_OK) {
38             if (err == Z_DATA_ERROR) {
39                 d_stream.next_in = (Bytef*)dummy_head;
40                 d_stream.avail_in = sizeof(dummy_head);
41                 if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK) {
42                     return -1;
43                 }
44             }
45             else return -1;
46         }
47     }
48     if (inflateEnd(&d_stream) != Z_OK) return -1;
49     ndata = d_stream.total_out;
50     51 }
52 
53 int main()
54 {
55     int i;
56     Bytef src[200] = {
57         0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x55, 0x8E, 0x41, 0x0A,
58         0xC2, 0x30, 0x14, 0x44, 0xEF, 0xF2, 0xD7, 0x59, 0xFC, 0xB4, 0x49, 0x9B, 0x66, 0xDB, 0x95, 0x3B,
59         0x17, 0x5E, 0x20, 0x34, 0xB1, 0x76, 0xD1, 0xA4, 0x34, 0x41, 0x90, 0xD2, 0xBD, 0x08, 0x82, 0xE0,
60         0x56, 0xF0, 0x24, 0xDE, 0x46, 0x7B, 0x0E, 0xD3, 0x0A, 0x05, 0x77, 0x9F, 0xF9, 0x33, 0xF3, 0x66,
61         0x80, 0xCA, 0x69, 0x03, 0x12, 0x09, 0xB4, 0xC6, 0x7B, 0x55, 0xC7, 0x1B, 0xA6, 0xFB, 0xF5, 0xFD,
62         0x7A, 0x4C, 0xE7, 0xDB, 0xE7, 0xF2, 0x04, 0x02, 0x5A, 0x05, 0x05, 0x72, 0x80, 0xD0, 0x74, 0x7E,
63         0x77, 0xEA, 0xFE, 0xDC, 0x1B, 0xBB, 0x77, 0xF3, 0xCF, 0x1B, 0xAB, 0x4D, 0x0F, 0x32, 0xA1, 0x98,
64         0x32, 0xC1, 0x08, 0xF4, 0xA6, 0x32, 0xCD, 0x71, 0x96, 0x68, 0x91, 0x30, 0x14, 0x09, 0x89, 0xF9,
65         0x36, 0x66, 0x29, 0xCB, 0x30, 0xC7, 0x0C, 0x19, 0x52, 0x5E, 0xC4, 0x1E, 0x5F, 0x97, 0xCE, 0x06,
66         0x63, 0x43, 0x04, 0x73, 0x5E, 0x60, 0x04, 0x86, 0x15, 0xE2, 0xEB, 0x8D, 0x06, 0xC9, 0x05, 0x4D,
67         0x45, 0x9E, 0xA5, 0x64, 0xC1, 0xAC, 0x13, 0x1A, 0x5F, 0xAA, 0xD6, 0xF4, 0x6A, 0x7B, 0x70, 0xC1,
68         0x2D, 0xCA, 0x8F, 0x37, 0x8E, 0xE3, 0x17, 0x6D, 0x19, 0x7E, 0x8C, 0xD7, 0x00, 0x00, 0x00 };
69 
70     Bytef dst[300] = { 0 };
71     gzdecompress(src, 200, dst, 300);
72     for (i = 0; i<300; i++)
73         printf("%c", dst[i]);
74     system("pause");
75     return 0;
76 }
77 
78 
79 #endif // GZIP_H

 

参考链接:
使用zlib实现gzip格式数据的压缩和解压 (这个代码有一丢丢错误,上面代码已经修改了)

Windows下zlib库和libPng库的编译和使用  (看第二步 “使用zlib静态库:zlibstat.h”  即可)

【毕业设计日记-4月】gzip格式解压

标签:

原文地址:http://www.cnblogs.com/Rivrr/p/5407361.html

(0)
(2)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!