Zlib库使用教程

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

[cpp]  view plain copy
  1. #include <stdlib.h>  
  2. #include <string.h>  
  3. #include <stdio.h>  
  4. #include <zlib.h>  
  5.   
  6. int main(int argc, char* argv[])  
  7. {  
  8.     char text[] = "zlib compress and uncompress test\nturingo@163.com\n2012-11-05\n";  
  9.     uLong tlen = strlen(text) + 1;  /* 需要把字符串的结束符'\0'也一并处理 */  
  10.     char* buf = NULL;  
  11.     uLong blen;  
  12.   
  13.     /* 计算缓冲区大小,并为其分配内存 */  
  14.     blen = compressBound(tlen); /* 压缩后的长度是不会超过blen的 */  
  15.     if((buf = (char*)malloc(sizeof(char) * blen)) == NULL)  
  16.     {  
  17.         printf("no enough memory!\n");  
  18.         return -1;  
  19.     }  
  20.   
  21.     /* 压缩 */  
  22.     if(compress(buf, &blen, text, tlen) != Z_OK)  
  23.     {  
  24.         printf("compress failed!\n");  
  25.         return -1;  
  26.     }  
  27.   
  28.     /* 解压缩 */  
  29.     if(uncompress(text, &tlen, buf, blen) != Z_OK)  
  30.     {  
  31.         printf("uncompress failed!\n");  
  32.         return -1;  
  33.     }  
  34.   
  35.     /* 打印结果,并释放内存 */  
  36.     printf("%s", text);  
  37.     if(buf != NULL)  
  38.     {  
  39.         free(buf);  
  40.         buf = NULL;  
  41.     }  
  42.   
  43.     return 0;  
  44. }  
zlib处理的对象是Bytef*字节流,很多人遇到字符串就会混淆了,其实很简单,字节流是没有结束符的,需要配备长度信息,所以处理字符串的时候需要把结束符也当成一个普通的字节,这样计算长度的时候也需要算它一份。另外绝大部分人都想动态分配缓冲区,也就是说需要多少再给多少,其实zlib本身有提供compressBound函数用于计算压缩后缓冲区长度的上限值,不需要额外再设计一些不适当的预测算法,不过解压缩的时候没有提供长度的预测,由于compress和uncompress一般都是成对使用的,预先保存好原文的长度即可。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值