功能:压缩一段字节流,但是不包含任何文件信息。所以如果要编写压缩数据,还要自定义头部信息之类的,自己生成对应的文件结构
设计: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语言中带的文件读写差不多。