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);
              }
       }
}
  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM