C语言 HTTP GZIP数据解压
这个代码在http://www.j286.com/有更新详情访问。
好吧~我承认..我是为了写博文在拆分工程- -!!!
在想要对gzip进行解压之前请确定你的数据是否需要做这个处理http://www.cnblogs.com/dsblab/articles/2328890.html
HTTP 头中标识数据经过gzip的如上面第二个框。
对gzip的处理我们可以用强大的zlib库进行处理
C语言的zlib编译
http://www.cnblogs.com/dsblab/articles/2328883.html
http://www.cnblogs.com/dsblab/articles/2328880.html
我不是在推销...没这你做不下去,如果你是linux下作开发的话编译应该那应该是小菜了。
在使用前需要包含相关文件和库
#include "zlib/zlib.h"
#pragma comment(lib, "zlib.lib")
当然解压数据长度你可以分配一个稍微大一些的空间来存储再realloc还是索性一个大数组,或者用其他zlib提供的函数就出在分配,这个要看你自己了。
注意,使用的时候不要把头文件穿进去,把DATA段传进去就行了,否则会怎么样我不知道。。。没试过C#的stream
1 /* HTTP gzip decompress */
2 /* 参数1.压缩数据 2.数据长度 3.解压数据 4.解压后长度 */
3 int httpgzdecompress(Byte *zdata, uLong nzdata, Byte *data, uLong *ndata)
4 {
5 int err = 0;
6 z_stream d_stream = {0}; /* decompression stream */
7 static char dummy_head[2] =
8 {
9 0x8 + 0x7 * 0x10,
10 (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
11 };
12 d_stream.zalloc = (alloc_func)0;
13 d_stream.zfree = (free_func)0;
14 d_stream.opaque = (voidpf)0;
15 d_stream.next_in = zdata;
16 d_stream.avail_in = 0;
17 d_stream.next_out = data;
18 if(inflateInit2(&d_stream, 47) != Z_OK) return -1;
19 while (d_stream.total_out < *ndata && d_stream.total_in < nzdata)
20 {
21 d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
22 if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
23 if(err != Z_OK )
24 {
25 if(err == Z_DATA_ERROR)
26 {
27 d_stream.next_in = (Bytef*) dummy_head;
28 d_stream.avail_in = sizeof(dummy_head);
29 if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)
30 {
31 return -1;
32 }
33 }
34 else return -1;
35 }
36 }
37 if(inflateEnd(&d_stream) != Z_OK) return -1;
38 *ndata = d_stream.total_out;
39 return 0;
40 }
如果对平台没要求的话还是建议用C#来做好了,省力省时
HttpWebResponse getRespone = (HttpWebResponse)get.GetResponse();
if (getRespone != null && getRespone.StatusCode == HttpStatusCode.OK)
{
recv = getRespone.ContentEncoding;
System.IO.Stream resStream = getRespone.GetResponseStream();
if (recv == "gzip")
{
resStream = new GZipStream(resStream, CompressionMode.Decompress);
}
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, Encoding.UTF8);
recv = sr.ReadToEnd();
sr.Close();
}
getRespone.Close();