Zlib的deflate, z_stream结构的使用
使用deflate进行压缩时,先要定义z_stream结构体,
先将z_stream的zalloc, zfree, opaque偏量设为Z_NULL, 再调用
deflateInit函数初始化z_stream结构,初始化时主要是用z_stream结构与Z_DEFAULT_COMPRESSION和默认压缩来初始化,
初始化好后,再要初始化四个重要分量,为被压缩源字符串next_in,被压源字符串的长度avail_in,压缩后字符串的最大长度(avail_out),压缩后字符串的存放缓冲区(next_out)。
设好后,还得设一个参数即刷新方式flush, 这个参数是deflate函数的第二个参数,一般设为Z_FINISH, 或者Z_NO_FLUSH, 如果是读的文件取字符串
可以使用flush = feof(source) ? Z_FINISH : Z_NO_FLUSH再设定。
以z_stream, flush为参数,调用deflate函数后,这时开始的next_out指向的内存中就有压缩的字符串了,但next_out, avail_out都会发生变化,其具体的变化是,avail_out会变为剩下的还没有使用的最大空间数,而next_out是指的原来的原来的指针加上所读的字符串,
压缩后,可以通过最大压缩后所以空间大小减avail_out得压缩后串大小,通过原来的压缩串指针得压缩后字符串。
如果有任何错误,调用deflateEnd函数,当avail_out等于零时,表示加密串满了,则还要压,不过一般不可能因为压缩串不可能大于源串,如果加密串没满,那么,确认一下avail_in是否为0, 表示把源串全压了,再通过flush的值判断是否再压。
以上完成了一次压缩
分享到:
相关推荐
= Z_STREAM_END) handle_error(err); } // 结束压缩 err = deflateEnd(&stream); if (err != Z_OK) handle_error(err); return 0; } ``` 上述代码演示了如何使用`zlib`的`deflate`函数进行数据压缩。同样...
} while (ret == Z_OK || ret == Z_STREAM_END); deflateEnd(&stream); compressedData.resize(compressedData.size() - stream.avail_out); return compressedData; } // 解压缩文件 QByteArray ...
if (ret == Z_OK || ret == Z_STREAM_END) { *destLen = stream.total_out; deflateEnd(&stream); return Z_OK; } else { deflateEnd(&stream); return ret; } } // 解压缩函数示例 uLong decompress_data...
= Z_STREAM_END) break; } deflateEnd(&stream); compressedData.resize(stream.total_out); return compressedData; } std::vector<u_char> decompressData(const std::vector<u_char>& compressedData) { ...
if (status == Z_STREAM_END) break; if (status != Z_OK) { deflateEnd(&stream); throw std::runtime_error("deflate failed"); } } // 更新输出大小 outputSize = outputSize - stream.avail_out; ...
例如,`Z_OK`表示操作成功,而`Z_STREAM_END`表示数据流已经结束。 6. 清理资源:最后,当不再需要Zlib库时,使用`deflateEnd()`或`inflateEnd()`来释放分配的内存和关闭上下文。 在实际应用中,为了方便使用,...
if (ret == Z_STREAM_ERROR) { // 错误处理 } } outputSize = stream.total_out; inflateEnd(&stream); } ``` 在这个例子中,我们使用`inflateInit2`初始化解压缩流,并设置`MAX_WBITS | 32`以支持gzip格式。...
2. **流式压缩与解压缩**:zlib支持连续的数据流处理,使用`deflate()`和`inflate()`函数可以在数据流中动态进行压缩和解压缩,适合处理大文件或网络传输。 3. **GZIP和ZLIB格式**:zlib可以创建和解析遵循GZIP和...
zlib库中的核心数据结构包括`z_stream`,这是一个结构体,包含了压缩或解压缩过程中需要的所有状态信息,如输入和输出缓冲区、压缩级别、错误代码等。开发者通过初始化和清理`z_stream`来开始和结束压缩/解压缩过程...
z_stream stream; // zlib流结构体 memset(&stream, 0, sizeof(stream)); stream.next_in = (Bytef*)input_data; // 输入数据 stream.avail_in = input_length; // 输入数据长度 // 压缩 compress(&stream, &...
- 初始化Zlib上下文:通过`zlibVersion()`检查库版本,并创建`z_stream`结构体实例,用于保存压缩状态。 - 设置压缩参数:通过`deflateInit2()`函数设置压缩级别、窗口大小等参数。 - 压缩数据:使用`deflate()`...
if (ret == Z_STREAM_END) { // 解压结束 break; } else if (ret != Z_OK) { // 错误处理 inflateEnd(&stream); throw std::runtime_error("Decompression error"); } // 写入解压的数据 out.flush(); }...
} while (result == Z_OK || result == Z_STREAM_END); if (result != Z_STREAM_END) { // 错误处理 } inflateEnd(&stream); ``` **libzip库** libzip是一个更高级的库,它允许开发者处理ZIP文件的创建、读取、...
- 压缩:创建`z_stream`结构体,初始化压缩状态(如`deflateInit2()`),然后调用`deflate()`进行多次迭代直到完成压缩,最后使用`deflateEnd()`释放资源。 - 解压缩:同样创建`z_stream`结构体,使用`inflateInit...
- 压缩数据:使用`deflate()`函数,将未压缩的数据写入`z_stream`,并获取压缩后的输出。 - 结束压缩:完成所有数据的压缩后,调用`deflateEnd()`释放资源。 - **解压缩**: - 初始化解压缩状态:调用`...
#include <google/protobuf/io/zero_copy_stream_impl_lite.h> #include <zlib.h> // 压缩protobuf消息 void CompressProto(const google::protobuf::Message& message, std::string* compressed) { std::unique_...
if (ret == Z_STREAM_ERROR) { throw std::runtime_error("deflate failed"); } out.seekp(stream.total_out, std::ios_base::beg); } while (stream.avail_out == 0); if (bytesRead < CHUNK_SIZE) { // ...
2. **初始化**:使用`z_stream`结构体实例化一个压缩或解压缩流对象,并通过`deflateInit()`或`inflateInit()`进行初始化。 3. **压缩/解压缩**:使用`deflate()`或`inflate()`函数处理数据。这些函数需要循环调用,...
3. 初始化ZLib上下文结构体(如`z_stream`)。 4. 调用ZLib的压缩函数(如`deflateInit2`、`deflate`)进行压缩操作。 5. 调用解压缩函数(如`inflateInit2`、`inflate`)进行解压缩操作。 6. 在完成压缩或解压缩后...
1. 初始化压缩流:使用`z_stream`结构体实例化一个压缩流对象,然后调用`deflateInit2()`函数设置压缩级别、压缩方法和其他参数。 2. 数据输入:通过调用`deflate()`函数,将待压缩的数据分块输入到压缩流中。每次...