zlib stream

 
官方帮助手册
http://www.zlib.net/manual.html
 
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include "zlib.h"
 
/* Compress data */
int zcompress(Bytef *data , uLong ndata ,
                       Bytef * zdata, uLong * nzdata)
{
        z_stream c_stream;
        int err = 0;
        if( data && ndata > 0)
       {
              c_stream.zalloc = ( alloc_func)0;
              c_stream.zfree = ( free_func)0;
              c_stream.opaque = ( voidpf)0;
               if( deflateInit(&c_stream, Z_DEFAULT_COMPRESSION ) != 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;
}
/* Compress gzip data */
int gzcompress(Bytef *data , uLong ndata ,
                        Bytef * zdata, uLong * nzdata)
{
        z_stream c_stream;
        int err = 0;
        if( data && ndata > 0)
       {
              c_stream.zalloc = ( alloc_func)0;
              c_stream.zfree = ( free_func)0;
              c_stream.opaque = ( voidpf)0;
               if( deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION , Z_DEFLATED ,
                     - MAX_WBITS, 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;
}
/* Uncompress data */
int zdecompress(Byte *zdata , uLong nzdata ,
                            Byte * data, uLong * ndata)
{
        int err = 0;
        z_stream d_stream; /* decompression stream */
       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( inflateInit(&d_stream) != 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) return -1;
       }
        if(inflateEnd(&d_stream) != Z_OK) return -1;
       * ndata = d_stream.total_out;
        return 0;
}
/* HTTP gzip decompress */
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 = ( 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;
                           }
                     }
                      else return -1;
              }
       }
        if(inflateEnd(&d_stream) != Z_OK) return -1;
       * ndata = d_stream.total_out;
        return 0;
}
/* Uncompress gzip data */
int gzdecompress(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,
       };
 
        int v = 20;
       * ndata = 20;
        for (;v<65330; v++)
       {
               zdata[v] = '\0';
       }
 
 
       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, -MAX_WBITS ) != 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;
}
 
#define BUF_SIZE 65535
int main()
{
 
        char *data = "hello word. this test message for this programe.for our work!hello word. this test message for this programe.for our work!hello word. this test message for this programe.for our work!";
        uLong ndata = strlen(data);
        Bytef zdata[ BUF_SIZE];
        uLong nzdata = BUF_SIZE;
        Bytef odata[ BUF_SIZE];
        uLong nodata = BUF_SIZE;
       memset(zdata, 0, BUF_SIZE);
 
        //if(zcompress((Bytef *)data, ndata, zdata, &nzdata) == 0)
        if(gzcompress(( Bytef *)data, ndata, zdata, &nzdata) == 0)
       {
              fprintf( stdout, "nzdata:%d %s\n", nzdata, zdata);
              memset(odata, 0, BUF_SIZE);
               //if(zdecompress(zdata, ndata, odata, &nodata) == 0)
               if(gzdecompress(zdata, ndata, odata, &nodata) == 0)
               //if(httpgzdecompress(zdata, ndata, odata, &nodata) == 0)
              {
                     fprintf( stdout, "%d %s\n", nodata, odata);
              }
       }
}
  
posted @ 2013-10-09 21:35  czjone  阅读(2936)  评论(0编辑  收藏  举报