官方帮助手册
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;
}
 
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);
              }
       }
}
  

zlib stream的更多相关文章

  1. composer "Failed to decode zlib stream"

    dockerFile 中安装composer.... RUN curl -s -f -L -o /tmp/installer.php https://raw.githubusercontent.com ...

  2. centos7 php7 安装composer时Failed to decode zlib stream解决办法

    1 下载安装脚本 php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" 2 运行安装脚 ...

  3. 安装composer Failed to decode zlib stream 问题解决方法

    https://getcomposer.org/download/ 页面下载最新版本 composer.phar 放到php.exe 页面下.创建一个.bat文件,存入下面内容 @ECHO OFF p ...

  4. composer Failed to decode zlib stream 无法解码zlib流

    Win7 中安装 Composer (PHP) 国内有些网络不能访问美国的Composer官网,可访问 Composer 中文网 学习. 目标 可以在任何目录下的项目中执行 PHP composer. ...

  5. win7安装composer Failed to decode zlib stream

    今天学习php的时候想安装一下composer,刚开始采用的是exe文件的安装方式,可是安装了好几次都没有安装成功,如下图: 可能还有其他的一些错误,所以这里我就换了一个方式安装,就是自己手动来安装c ...

  6. Win7下安装composer, 并使用其安装smarty

    安装composer需要开启PHP openssl扩展. 1) 先查看PHP是否开启了openssl扩展 键盘win+r 输出cmd, 可以看到Dos窗口, 然后执行php -m (需要添加PHP环境 ...

  7. composer安装。

    我们这里实在Windows下进行的安装.1.下载Composer安装包.网址:https://getcomposer.org/download/下载Composer-Setup.exe 安装文件.2. ...

  8. table2excel使用

    原table2excel代码 /* * 采用jquery模板插件——jQuery Boilerplate * * Made by QuJun * 2017/01/10 */ //table2excel ...

  9. 如何查看PHP的配置信息

    1.问题描述 如何利用PHP函数查看PHP的配置信息 2.问题函数 <?php echo phpinfo(); ?> 3.输出结果 phpinfo() PHP Version => ...

随机推荐

  1. JavaWeb项目中使用ajax上传文件

    1.jsp $("#cxsc").click(function(){ var bankId = $("#bankId").val(); var formdata ...

  2. unity生命周期

    1.静态构造函数 当程序集被加载的时候就被调用了,如果你的unity处于编辑状态时,此时你保存一个脚本(从而迫使重新编译),静态构造函数会立即被调用,因为unity加载了DLL.并且它将不会再次运行, ...

  3. express常用代码片段

    请求模块: var express = require('express'); var router = express.Router(); // 拿到express框架的路由 var mongoos ...

  4. (笔记) RealTimeRender[实时渲染] C3

    @author: 白袍小道 转载表明,查看随缘 前言: 从历史上看,图形加速始于每个像素扫描线上的插值颜色重叠一个三角形,然后显示这些值.包括访问图像数据允许纹理应用于表面.添加硬件 插入和测试z深度 ...

  5. docker搭建jira-7.11.1 + 破解

    几行命令教你搭建一个jira最新版.所有步骤必不可少.破解补丁需要的请在下面留言. pull docker 镜像:  jira:7.11.1(目前的最新版本)    mysql:5.7 docker ...

  6. min_free_kbytes是内存最安全值的阈值,然后这个值是怎么影响到系统内存回收的呢?

    min_free_kbytes 内存域水印值:min_free_kbytes 当不设置的时候:sqrt(16M)=4k 4k*4 = 16k 设置内存水印值的函数是: 6792 /* 6793 * I ...

  7. [洛谷P3509][POI2010]ZAB-Frog

    题目大意:有$n$个点,每个点有一个距离(从小到大给出),从第$i$个点跳一次,会跳到距离第$i$个点第$k$远的点上(若有两个点都是第$k$远,就跳到编号小的上).问对于从每个点开始跳,跳$m$次, ...

  8. [bzoj] 2453 维护数列 || 单点修改分块

    原题 询问区间有种个颜色,单点修改某个位置. 修改次数<=1000 维护pre[i]为前一个与当前位置颜色一样的位置. 询问时以pre为关键字sort,lower_bound找pre<x的 ...

  9. Intel与Motorola区别

    Intel低字节在前 Motorola高字节在前    在进行CAN总线通信设计或者测试过 程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式.究竟两种编码格式有什 ...

  10. 【ZOJ4061】Magic Multiplication(构造)

    题意:定义一个新运算为两个数A,B上每一位相乘,然后顺次接在一起,现在给定结果C和原来两个数字的长度,要求恢复成原来的数字A,B 若有多解输出A字典序最小的,A相同输出B字典序最小的,无解输出Impo ...