gzip and deflate

来源:互联网 发布:淘宝折扣网 编辑:程序博客网 时间:2024/04/25 10:14

Gzip/deflate 解码

 

一般的http网页在传输时为了减少流量加快传输速度,都会对数据进行压缩,压缩方式一般有gzipdeflate两种方式。

gzip的解压方式如下:

int httpgzdecompress(Byte *zdata, uLong nzdata, Byte*data, uLong *ndata)

{

    int err = 0;

    z_streamd_stream = {0}; /* decompression stream */

    static chardummy_head[2] =

    {

        0x8 +0x7 * 0x10,

        (((0x8 +0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,

    };

   d_stream.zalloc = (alloc_func)0;

   d_stream.zfree = (free_func)0;

   d_stream.opaque = (voidpf)0;

   d_stream.next_in  = zdata;

   d_stream.avail_in = 0;

   d_stream.next_out = data;

   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;

               }

            }

            elsereturn -1;

        }

    }

   if(inflateEnd(&d_stream) != Z_OK) return -1;

    *ndata =d_stream.total_out;

    return 0;

}

 

Deflategzip解压函数的差别只在于

   if(inflateInit2(&d_stream, -15) !=Z_OK) return -1;

 

原创粉丝点击