zlib的使用

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

以上为转帖

下面个人使用觉得,deslen的输入参数很关键,有可能看不明白。

deslen参数是有意义的,传递进去的时候,deslen必须是比sourcelen大的,具体大小如上面的公式所得。为什么要大,是在这样的情况,比如压缩一个2个字节的buffer,那压缩出来实际上是更大的。

在使用中,发现compress函数返回成功或者失败,实际上是根据deslen的传递来判断的。这个时候如果传递deslen=-1,则肯定是返回成功的。就算desbuffer越界了也是成功。

想简单的话就可以直接把deslen赋值-1传进去用。

desLen=-1;
return compress((Bytef*)desBuf,(uLongf*)&desLen,(Bytef*)orgBuf,orgLen);

C++中使用zlib库可以实现数据的压缩和解压缩。下面是一个简单的示例代码: ```cpp #include <iostream> #include <fstream> #include <string> #include <zlib.h> // 压缩函数 bool compressFile(const std::string& sourceFile, const std::string& destFile) { std::ifstream inFile(sourceFile, std::ios::binary); std::ofstream outFile(destFile, std::ios::binary); if (!inFile || !outFile) { return false; } z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; if (deflateInit(&stream, Z_DEFAULT_COMPRESSION) != Z_OK) { return false; } char inBuffer[1024]; char outBuffer[1024]; stream.avail_in = inFile.readsome(inBuffer, sizeof(inBuffer)); stream.next_in = reinterpret_cast<Bytef*>(inBuffer); do { stream.avail_out = sizeof(outBuffer); stream.next_out = reinterpret_cast<Bytef*>(outBuffer); deflate(&stream, Z_FINISH); outFile.write(outBuffer, sizeof(outBuffer) - stream.avail_out); } while (stream.avail_out == 0); deflateEnd(&stream); inFile.close(); outFile.close(); return true; } // 解压缩函数 bool decompressFile(const std::string& sourceFile, const std::string& destFile) { std::ifstream inFile(sourceFile, std::ios::binary); std::ofstream outFile(destFile, std::ios::binary); if (!inFile || !outFile) { return false; } z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; if (inflateInit(&stream) != Z_OK) { return false; } char inBuffer[1024]; char outBuffer[1024]; stream.avail_in = inFile.readsome(inBuffer, sizeof(inBuffer)); stream.next_in = reinterpret_cast<Bytef*>(inBuffer); do { stream.avail_out = sizeof(outBuffer); stream.next_out = reinterpret_cast<Bytef*>(outBuffer); inflate(&stream, Z_NO_FLUSH); outFile.write(outBuffer, sizeof(outBuffer) - stream.avail_out); } while (stream.avail_out == 0); inflateEnd(&stream); inFile.close(); outFile.close(); return true; } int main() { std::string sourceFile = "input.txt"; std::string compressedFile = "compressed.zlib"; std::string decompressedFile = "decompressed.txt"; // 压缩文件 if (compressFile(sourceFile, compressedFile)) { std::cout << "File compressed successfully." << std::endl; } else { std::cout << "Failed to compress file." << std::endl; } // 解压缩文件 if (decompressFile(compressedFile, decompressedFile)) { std::cout << "File decompressed successfully." << std::endl; } else { std::cout << "Failed to decompress file." << std::endl; } return 0; } ``` 这个示例代码演示了如何使用zlib库进行文件的压缩和解压缩。你可以根据自己的需求修改输入输出文件的路径和名称。在压缩文件时,使用`deflate`函数将输入数据压缩,并将压缩后的数据写入输出文件。在解压缩文件时,使用`inflate`函数将压缩数据解压缩,并将解压缩后的数据写入输出文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值