【神经网络与深度学习】【C/C++】ZLIB学习
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一般都是成对使用的,预先保存好原文的长度即可。
相关文章
- C++模板之typename和class关键字的区别
- C++虚函数与纯虚函数用法与区别
- 50 C++ - 如何实现动态绑定
- 87 C++ - 常用遍历算法
- C++中UDP通讯详解
- 《C++面向对象高效编程(第2版)》——3.11 类名、成员函数名、参数类型和文档
- 《从缺陷中学习C/C++》——6.9 重复申请内存未释放
- 《数字图像处理与机器视觉——Visual C++与Matlab实现》——1.2 Matlab图像类型及其存储方式
- C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete
- 基于QT(C++)实现线性表的建立、插入、删除、查找等基本操作【100010710】
- C/C++变量命名规则
- C++ 什么是多态
- 2022年7月11日热点分享:TIOBE 7月榜单 Python、C、Java、C++霸榜前四|Java学习,必读《Java核心技术》
- C++牛客网剑指Offer学习笔记(三)
- C++基础学习笔记----第十三课(操作符重载-下)
- 学习C++服务端一:MySql与C++
- 【C++快速上手】十一、assert学习笔记
- 【C++快速上手】九、virtual学习笔记
- 【C++快速上手】七、纯虚函数和抽象类学习笔记
- 【C++快速上手】五、inline学习笔记
- C++基础学习教程(七)----类编写及类的两个特性解析--->多态&继承
- 学习算法 - 表指针实现~ C++
- C/C++学习站点资源
- 采用完成端口(IOCP)实现高性能网络服务器(Windows c++版)
- C++ 学习资料
- C/C++教程 第四章 —— 理解文件操作
- 编程参考 - C/C++中的左右移位操作
- C++实操 - 访问控制