使用zlib库里的compress函数与uncompress函数
2015-07-24 12:14
253 查看
在第一次使用uncompress函数的时候,就把我弄得很老火,最后错误的原因现在具体是什么也没有弄明白,特别无语。
compress函数与uncompress函数可以跨平台。在Linux上编译链接时别忘了加上 -lz。
使用时一定要注意的地方:
compress函数与uncompress函数的第二个参数,一定是要重新定义一个变量才能保证它不会出现错。当时我的不管怎么弄程序,就一直提示Z_BUF_ERROR。重新定义了一个变量让要处理的数据赋值给这个变量,再赋值函数的第二个参数,具体什么原因,可能是我的程序在类型转换的过程中值发生了变化。
参考如下网站:
http://blog.chinaunix.net/uid-24599332-id-2122842.html
一下为转载内容:
zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity)。zlib 也支持读写 gzip
(.gz) 格式的文件。下面介绍两个最有用的函数——compress 和 uncompress。
int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数destLen 是传址调用。当调用函数时,destLen表示 dest 缓冲区的大小,destLen >
(sourceLen +
12)*100.1%。当函数退出后,destLen 表示压缩后缓冲区的实际大小。此时 destLen / sourceLen 正好是压缩率。
compress 若成功,则返回 Z_OK;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。
int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二个参数destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。
uncompress 若成功,则返回 Z_OK ;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。若输入数据有误,则返回 Z_DATA_ERROR。
zlib 带的 example.c 是个很好的学习范例,值得一观。我们写个程序,验证 zlib 的压缩功能。所写的测试程序保存为 testzlib.cpp ,放在zlib-1.1.4 目录下。程序源代码:
// testzlib.cpp 简单测试 zlib 的压缩功能
#include
#include
#include
#include "zlib.h"
using namespace std;
int main()
{
int err;
Byte compr[200], uncompr[200]; //
big enough
uLong comprLen, uncomprLen;
const char* hello = "12345678901234567890123456789012345678901234567890";
uLong len = strlen(hello) + 1;
comprLen = sizeof(compr)
/ sizeof(compr[0]);
err = compress(compr, &comprLen, (const Bytef*)hello, len);
if (err != Z_OK) {
cerr << "compess error: " << err << '\n';
exit(1);
}
cout << "orignal size: " << len
<< " , compressed size : " << comprLen << '\n';
strcpy((char*)uncompr, "garbage");
err = uncompress(uncompr, &uncomprLen, compr, comprLen);
if (err != Z_OK) {
cerr << "uncompess error: " << err << '\n';
exit(1);
}
cout << "orignal size: " << len
<< " , uncompressed size : " << uncomprLen << '\n';
if (strcmp((char*)uncompr, hello)) {
cerr << "BAD uncompress!!!\n";
exit(1);
} else {
cout << "uncompress() succeed: \n" << (char *)uncompr;
}
}
编译执行这个程序,输出应该是
D:\libpng\zlib-1.1.4>bcc32 testzlib.cpp
zlib.lib
D:\libpng\zlib-1.1.4>testzlib
orignal size: 51 , compressed size : 22
orignal size: 51 , uncompressed size : 51
uncompress() succeed:
12345678901234567890123456789012345678901234567890
compress函数与uncompress函数可以跨平台。在Linux上编译链接时别忘了加上 -lz。
使用时一定要注意的地方:
compress函数与uncompress函数的第二个参数,一定是要重新定义一个变量才能保证它不会出现错。当时我的不管怎么弄程序,就一直提示Z_BUF_ERROR。重新定义了一个变量让要处理的数据赋值给这个变量,再赋值函数的第二个参数,具体什么原因,可能是我的程序在类型转换的过程中值发生了变化。
参考如下网站:
http://blog.chinaunix.net/uid-24599332-id-2122842.html
一下为转载内容:
zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity)。zlib 也支持读写 gzip
(.gz) 格式的文件。下面介绍两个最有用的函数——compress 和 uncompress。
int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数destLen 是传址调用。当调用函数时,destLen表示 dest 缓冲区的大小,destLen >
(sourceLen +
12)*100.1%。当函数退出后,destLen 表示压缩后缓冲区的实际大小。此时 destLen / sourceLen 正好是压缩率。
compress 若成功,则返回 Z_OK;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。
int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二个参数destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。
uncompress 若成功,则返回 Z_OK ;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。若输入数据有误,则返回 Z_DATA_ERROR。
zlib 带的 example.c 是个很好的学习范例,值得一观。我们写个程序,验证 zlib 的压缩功能。所写的测试程序保存为 testzlib.cpp ,放在zlib-1.1.4 目录下。程序源代码:
// testzlib.cpp 简单测试 zlib 的压缩功能
#include
#include
#include
#include "zlib.h"
using namespace std;
int main()
{
int err;
Byte compr[200], uncompr[200]; //
big enough
uLong comprLen, uncomprLen;
const char* hello = "12345678901234567890123456789012345678901234567890";
uLong len = strlen(hello) + 1;
comprLen = sizeof(compr)
/ sizeof(compr[0]);
err = compress(compr, &comprLen, (const Bytef*)hello, len);
if (err != Z_OK) {
cerr << "compess error: " << err << '\n';
exit(1);
}
cout << "orignal size: " << len
<< " , compressed size : " << comprLen << '\n';
strcpy((char*)uncompr, "garbage");
err = uncompress(uncompr, &uncomprLen, compr, comprLen);
if (err != Z_OK) {
cerr << "uncompess error: " << err << '\n';
exit(1);
}
cout << "orignal size: " << len
<< " , uncompressed size : " << uncomprLen << '\n';
if (strcmp((char*)uncompr, hello)) {
cerr << "BAD uncompress!!!\n";
exit(1);
} else {
cout << "uncompress() succeed: \n" << (char *)uncompr;
}
}
编译执行这个程序,输出应该是
D:\libpng\zlib-1.1.4>bcc32 testzlib.cpp
zlib.lib
D:\libpng\zlib-1.1.4>testzlib
orignal size: 51 , compressed size : 22
orignal size: 51 , uncompressed size : 51
uncompress() succeed:
12345678901234567890123456789012345678901234567890
相关文章推荐
- 学习笔记:多行文本溢出显示省略号(…)
- Spark源码系列(一)spark-submit提交作业过程
- 在Linux系统上查看Apache服务器的错误日志
- JavaScript启示录
- AutoLayout(三)
- Category分类的基本使用
- zoj1414 Number Steps
- JavaScript启示录
- 使用NSURLSession
- Oracle分页查询语句(三)
- Oracle分页查询语句(二)
- Oracle分页查询语句(一)
- maven构造web项目 web.xml更改
- 2015 Multi-University Training Contest 2
- Oracle分页查询格式(十一)
- AutoLayout(二)
- Linux 发送信号, 修改键映射
- java GUI游戏界面问题 play,exit操作
- jQuery 源码分析6: jQuery 基本静态方法(二)
- Kth Smallest Element in a BST