`
彡彡稻草
  • 浏览: 38537 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Zlib的deflate, z_stream结构的使用

    博客分类:
  • IOS
阅读更多

 

 

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的值判断是否再压。

 

以上完成了一次压缩

分享到:
评论

相关推荐

    zlib_128_dll.zip

    = Z_STREAM_END) handle_error(err); } // 结束压缩 err = deflateEnd(&stream); if (err != Z_OK) handle_error(err); return 0; } ``` 上述代码演示了如何使用`zlib`的`deflate`函数进行数据压缩。同样...

    qt中使用zlib的示例程序

    } while (ret == Z_OK || ret == Z_STREAM_END); deflateEnd(&stream); compressedData.resize(compressedData.size() - stream.avail_out); return compressedData; } // 解压缩文件 QByteArray ...

    zlib库(32位)亲测可用

    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...

    zlib 1.2.11 库demo

    = Z_STREAM_END) break; } deflateEnd(&stream); compressedData.resize(stream.total_out); return compressedData; } std::vector<u_char> decompressData(const std::vector<u_char>& compressedData) { ...

    C++ zlib库源码编译及简单使用(VS2019)

    if (status == Z_STREAM_END) break; if (status != Z_OK) { deflateEnd(&stream); throw std::runtime_error("deflate failed"); } } // 更新输出大小 outputSize = outputSize - stream.avail_out; ...

    zlib库c++简单封装.zip

    例如,`Z_OK`表示操作成功,而`Z_STREAM_END`表示数据流已经结束。 6. 清理资源:最后,当不再需要Zlib库时,使用`deflateEnd()`或`inflateEnd()`来释放分配的内存和关闭上下文。 在实际应用中,为了方便使用,...

    gzip解压和压缩,在内存使用

    if (ret == Z_STREAM_ERROR) { // 错误处理 } } outputSize = stream.total_out; inflateEnd(&stream); } ``` 在这个例子中,我们使用`inflateInit2`初始化解压缩流,并设置`MAX_WBITS | 32`以支持gzip格式。...

    zlib算法库,zlib算法库

    2. **流式压缩与解压缩**:zlib支持连续的数据流处理,使用`deflate()`和`inflate()`函数可以在数据流中动态进行压缩和解压缩,适合处理大文件或网络传输。 3. **GZIP和ZLIB格式**:zlib可以创建和解析遵循GZIP和...

    zlib库英文使用手册

    zlib库中的核心数据结构包括`z_stream`,这是一个结构体,包含了压缩或解压缩过程中需要的所有状态信息,如输入和输出缓冲区、压缩级别、错误代码等。开发者通过初始化和清理`z_stream`来开始和结束压缩/解压缩过程...

    zlib-1.2.12 MacOS版本

    z_stream stream; // zlib流结构体 memset(&stream, 0, sizeof(stream)); stream.next_in = (Bytef*)input_data; // 输入数据 stream.avail_in = input_length; // 输入数据长度 // 压缩 compress(&stream, &...

    C++ Zlib解压zip文件Demo

    if (ret == Z_STREAM_END) { // 解压结束 break; } else if (ret != Z_OK) { // 错误处理 inflateEnd(&stream); throw std::runtime_error("Decompression error"); } // 写入解压的数据 out.flush(); }...

    64位的zlib和libzip相关头文件和库文件,用于c++实现解压缩文件功能使用

    } while (result == Z_OK || result == Z_STREAM_END); if (result != Z_STREAM_END) { // 错误处理 } inflateEnd(&stream); ``` **libzip库** libzip是一个更高级的库,它允许开发者处理ZIP文件的创建、读取、...

    zlib for vs2012

    - 压缩:创建`z_stream`结构体,初始化压缩状态(如`deflateInit2()`),然后调用`deflate()`进行多次迭代直到完成压缩,最后使用`deflateEnd()`释放资源。 - 解压缩:同样创建`z_stream`结构体,使用`inflateInit...

    zlib库文件

    - 压缩数据:使用`deflate()`函数,将未压缩的数据写入`z_stream`,并获取压缩后的输出。 - 结束压缩:完成所有数据的压缩后,调用`deflateEnd()`释放资源。 - **解压缩**: - 初始化解压缩状态:调用`...

    c/c++,zlib库,压缩文件库

    - 初始化Zlib上下文:通过`zlibVersion()`检查库版本,并创建`z_stream`结构体实例,用于保存压缩状态。 - 设置压缩参数:通过`deflateInit2()`函数设置压缩级别、窗口大小等参数。 - 压缩数据:使用`deflate()`...

    pb压缩代码

    #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_...

    压缩与解压缩文件 C++

    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) { // ...

    zlib的安装与使用

    2. **初始化**:使用`z_stream`结构体实例化一个压缩或解压缩流对象,并通过`deflateInit()`或`inflateInit()`进行初始化。 3. **压缩/解压缩**:使用`deflate()`或`inflate()`函数处理数据。这些函数需要循环调用,...

    zlib.h+zconf.h+zlib.lib+zlib1.dll

    3. 初始化ZLib上下文结构体(如`z_stream`)。 4. 调用ZLib的压缩函数(如`deflateInit2`、`deflate`)进行压缩操作。 5. 调用解压缩函数(如`inflateInit2`、`inflate`)进行解压缩操作。 6. 在完成压缩或解压缩后...

    Gh0st 学习笔记之 zlib调用

    1. 初始化压缩流:使用`z_stream`结构体实例化一个压缩流对象,然后调用`deflateInit2()`函数设置压缩级别、压缩方法和其他参数。 2. 数据输入:通过调用`deflate()`函数,将待压缩的数据分块输入到压缩流中。每次...

Global site tag (gtag.js) - Google Analytics