官网: http://www.zlib.net/
功能:压缩一段字节流,但是不包含任何文件信息。所以如果要编写压缩数据,还要自定义头部信息之类的,自己生成对应的文件结构
设计:CMake编译工具(用于在windows中进行官网上的包进行工程生成,英语好的可以通过example来进行学习)。
关键字:compress,uncompress, inflate,deflate。
- 简单解压缩:(前提,dest和source都是已分配足够内存的内存地址),OF()是自定义的宏,去掉就好。
压缩数据块
int ZEXPORT compress OF (( Bytef * dest , uLongf * destLen ,
const Bytef * source , uLong sourceLen ));
解压数据块
int ZEXPORT uncompress OF (( Bytef * dest , uLongf * destLen ,
const Bytef * source , uLong sourceLen ));
- 分块解压缩:分块传递数据,然后对数据进行解压缩,感觉没什么用,可以根据上述两个函数模拟。
关键结构:
typedef struct z_stream_s {
z_const Bytef * next_in ; /* next input byte */
uInt avail_in ; /* number of bytes available at next_in */
uLong total_in ; /* total number of input bytes read so far */
Bytef * next_out ; /* next output byte will go here */
uInt avail_out ; /* remaining free space at next_out */
uLong total_out ; /* total number of bytes output so far */
z_const char * msg ; /* last error message, NULL if no error */
struct internal_state FAR * state ; /* not visible by applications */
alloc_func zalloc ; /* used to allocate the internal state */
free_func zfree ; /* used to free the internal state */
voidpf opaque ; /* private data object passed to zalloc and zfree */
int data_type ; /* best guess about the data type: binary or text
for deflate, or the decoding state for inflate */
uLong adler ; /* Adler-32 or CRC-32 value of the uncompressed data */
uLong reserved ; /* reserved for future use */
} z_stream ;
typedef z_stream FAR * z_streamp ;
该结构作为参数执行接下来的函数,传递解压缩的必要信息,比如:目标地址,数量,原始地址数量,写入数量,回调函数(目前不知道这个回调函数是干嘛的)。
err = deflateInit (& c_stream , Z_BEST_SPEED ); 《==》 err = inflateInit (& d_stream );
err = deflate (& c_stream , Z_NO_FLUSH ); 《==》 err = inflate (& d_stream , Z_NO_FLUSH );
err = deflateEnd (& c_stream ); 《==》 err = inflateEnd (& d_stream );
- 压缩数据也是支持直接读写的。用处的话感觉就是你可以写一个字符马上被压缩,读出来的字节也经过了解压。最后形成的是一个压缩文件。
相关结构gzFile, z_off_t;
相关函数:gzopen(), gzputc, gzputs, gzprintf, gzseek, gzcolose, gzread, gzungetc, gzgetc, gzgets。使用方法跟C语言中带的文件读写差不多。