zlib(http://zlib.NET/)提供了简洁高效的In-Memory数据压缩和解压缩系列API函数,很多应用都会用到这个库,其中compress和uncompress函数是最基本也是最常用的。不过很奇怪的是,compress和uncompress函数尽管已经非常的简单,却仍然有不少人用得不好,其实归根结底还是在于有些事情没有弄明白,这里大家先看下面的代码

#include <stdlib.h>  

#include <string.h>  

#include <stdio.h>  

#include <zlib.h>  

  

int main(int argc, char* argv[])  

{  

    char text[] = "zlib compress and uncompress test\nturingo@163.com\n2012-11-05\n";  

    uLong tlen = strlen(text) + 1;  /* 需要把字符串的结束符'\0'也一并处理 */  

    char* buf = NULL;  

    uLong blen;  

  

    /* 计算缓冲区大小,并为其分配内存 */  

    blen = compressBound(tlen); /* 压缩后的长度是不会超过blen的 */  

    if((buf = (char*)malloc(sizeof(char) * blen)) == NULL)  

    {  

        printf("no enough memory!\n");  

        return -1;  

    }  

  

    /* 压缩 */  

    if(compress(buf, &blen, text, tlen) != Z_OK)  

    {  

        printf("compress failed!\n");  

        return -1;  

    }  

  

    /* 解压缩 */  

    if(uncompress(text, &tlen, buf, blen) != Z_OK)  

    {  

        printf("uncompress failed!\n");  

        return -1;  

    }  

  

    /* 打印结果,并释放内存 */  

    printf("%s", text);  

    if(buf != NULL)  

    {  

        free(buf);  

        buf = NULL;  

    }  

  

    return 0;  

}

zlib处理的对象是Bytef*字节流,很多人遇到字符串就会混淆了,其实很简单,字节流是没有结束符的,需要配备长度信息,所以处理字符串的时候需要把结束符也当成一个普通的字节,这样计算长度的时候也需要算它一份。另外绝大部分人都想动态分配缓冲区,也就是说需要多少再给多少,其实zlib本身有提供compressBound函数用于计算压缩后缓冲区长度的上限值,不需要额外再设计一些不适当的预测算法,不过解压缩的时候没有提供长度的预测,由于compress和uncompress一般都是成对使用的,预先保存好原文的长度即可。

最新文章

  1. gulp同步执行任务
  2. [py]简易pick lucky num程序
  3. Nginx-限制汇总
  4. Linux 账户信息显示和实现账户安全
  5. GCD之dispatch queue深入浅出
  6. Metadata Lock原理7
  7. How to Read, Write XLSX File in Java - Apach POI Example---reference
  8. 用 Eclipse 下载 Git 仓库中代码
  9. firefox os 2.1版本号UI接口方面有了质的飞跃
  10. [转载] 谷歌技术&quot;三宝&quot;之谷歌文件系统
  11. 进程间数据传递:Queue,Pipe 进程间数据共享:Manager
  12. .Net Core 配置文件appsettings
  13. kali安装显卡驱动
  14. JSTL、JSTL核心标签库——流程处理标签
  15. LOG4J spring与mybatis整合
  16. 【CF472G】Design Tutorial: Increase the Constraints
  17. RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法
  18. Accounting_会计基础
  19. AssetBundle 在Android机子上进行读取 .
  20. [CodeForces-375E]Red and Black Tree

热门文章

  1. css 判断是iphone4s iphone5 加载不同样式
  2. HDU-2594-Simpsons&#39; Hidden Talents(kmp, 扩展kmp)
  3. Linux下nc或scp命令来实现文件传输
  4. JavaScript相关知识点
  5. Monkey使用详情
  6. 前端Web浏览器基于Flash如何实时播放监控视频画面(四)之使用videoJs‘拉流’
  7. [HEOI2016&amp;TJOI2016] 排序(线段树)
  8. jeecg中自定义dialog,实现窗体的弹出
  9. 网络爬虫技术实现java依赖库整理输出
  10. JVM 监控工具——jps