1.下载网址
编译gcc main.c gzip.c -lz
2.安装到本地
目前最新版本zlib是zlib1.2。8,安装开始;
$tar -xvzf zlib-1.2.3.tar.gz
$cd zlib-1.2.3.tar.gz
$./configure
$make
$sudo make install
3.使用
借鉴的别人的压缩和解压函数
gzip.c gzip.h
gzip.h
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <zlib.h>
5 #ifndef _ZGZIP_H
6 #define _ZGZIP_H
7 #define Z_HEADER_SIZE 12
8
9 /* Compress gzip data */
10 int gzcompress(Byte *data, uLong ndata, Byte *zdata, uLong *nzdata);
11
12 /* http gzip Uncompress data */
13 int httpgzdecompress(Byte *zdata, uLong nzdata,Byte *data, uLong *ndata);
14 #endif
gzip.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "zlib.h"
#ifndef GZIP_H
#define GZIP_H
/* Compress gzip data */
/* data 原数据 ndata 原数据长度 zdata 压缩后数据 nzdata 压缩后长度 */
int gzcompress(Byte *data, uLong ndata,
Byte *zdata, uLong *nzdata)
{
z_stream c_stream;
int err = 0;
if(data && ndata > 0)
{
c_stream.zalloc = NULL;
c_stream.zfree = NULL;
c_stream.opaque = NULL;
if(deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY) != Z_OK) return -1;
c_stream.next_in = data;
c_stream.avail_in = ndata;
c_stream.next_out = zdata;
c_stream.avail_out = *nzdata;
while (c_stream.avail_in != 0 && c_stream.total_out < *nzdata)
{
if(deflate(&c_stream, Z_NO_FLUSH) != Z_OK) return -1;
}
if(c_stream.avail_in != 0) return c_stream.avail_in;
for (;;) {
if((err = deflate(&c_stream, Z_FINISH)) == Z_STREAM_END) break;
if(err != Z_OK) return -1;
}
if(deflateEnd(&c_stream) != Z_OK) return -1;
*nzdata = c_stream.total_out;
return 0;
}
return -1;
}
/* HTTP gzip decompress */
/* zdata 数据 nzdata 原数据长度 data 解压后数据 ndata 解压后长度 */
int httpgzdecompress(Byte *zdata, uLong nzdata,
Byte *data, uLong *ndata)
{
int err = 0;
z_stream d_stream = {0}; /* decompression stream */
static char dummy_head[2] = {
0x8 + 0x7 * 0x10,
(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
};
d_stream.zalloc = NULL;
d_stream.zfree = NULL;
d_stream.opaque = NULL;
d_stream.next_in = zdata;
d_stream.avail_in = 0;
d_stream.next_out = data;
//if(inflateInit2(&d_stream, MAX_WBITS + 16) != Z_OK) return -1;
if(inflateInit2(&d_stream, 47) != Z_OK) return -1;
while(d_stream.total_out < *ndata && d_stream.total_in < nzdata) {
d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
if(err != Z_OK) {
if(err == Z_DATA_ERROR) {
d_stream.next_in = (Bytef*) dummy_head;
d_stream.avail_in = sizeof(dummy_head);
if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK) {
return -1;
}
} else return -1;
}
}
if(inflateEnd(&d_stream) != Z_OK) return -1;
*ndata = d_stream.total_out;
return 0;
}
#endif // GZIP_H
main.c
1 #include <stdio.h>
2 #include "gzip.h"
3
4 int main()
5 {
6 int err;
7 Byte compr[200], uncompr[200]; // big enough
8 uLong comprLen, uncomprLen;
1 #include <stdio.h>
2 #include "gzip.h"
3
4 int main()
5 {
6 int err;
7 Byte compr[200], uncompr[200]; // big enough
8 uLong comprLen, uncomprLen;
9 char* hello = "12345678901234567890123456789012345678901234567890";
10
11 uLong len = strlen(hello) + 1;
12 comprLen = sizeof(compr) / sizeof(compr[0]);
13 err = gzcompress((Byte*)hello, len, compr, &comprLen);
14
15 if (err != Z_OK)
16 {
17 exit(1);
18 }
19 printf("cpmprlen=%d\n",comprLen);
20 strcpy((char*)uncompr, "garbage");
21 err = httpgzdecompress(compr, comprLen, uncompr, &uncomprLen);
22
23 if (err != Z_OK)
24 {
25 exit(1);
26 }
27
28
29 if (strcmp((char*)uncompr, hello))
30 {
31 exit(1);
32 } else {
33
34 printf("uncomprlen=%d\nuncompr=%s\n",uncomprLen,uncompr);
35 }
36
37 return 0;
38 }
编译gcc main.c gzip.c -lz