最近项目里为了减少传输数据量,需要进行数据的压缩和解压。网上搜索和之前项目中看到是使用到了zlib一个比较小巧的库,具体的地址请查看官网。如果仅仅是数据的解压缩,那直接跟从官网的教程就好。该地址简单的给出了压缩和解压的实现。但是想做我们的项目是有一些历史的原因还引用了crc32的校验,所以在解压和压缩之前都需要对数据进行crc生成和校验。经过了的一段时间摸索,最终流程也终于走通了。
crc32
crc32介绍
crc32校验
对于crc校验,一般有两种方式。
- 单独对crc校验码进行校验。在这种方式中,原始数据和crc校验码是分开存储,分开进行校验的;
- 对原始数据crc校验码一起进行校验,进行校验的时候是不知道哪一部分是数据,哪一部分是crc校验码的。采用这种方法比较方便在使用起来,下面代码示例也是采用的这一种方式。
zlib
压缩算法介绍
常用的压缩算法基本上是两种,这个在zlib库里也有介绍。
- huffman编码,它主要是采用变长的字符进行压缩编码。出现的概率越高,其编码越短,最终编码长度相应的就越短。
- lz777,这个大家自行搜索吧,主要是通过一个距离标识来说明下一个字符的位置。
zlib与crc32使用
该测试代码主要是包括压缩、解压两个函数。在测试代码中对压缩的数据生成crc校验码,并把校验码追加到压缩数据的末尾,成为最终的压缩的数据。解压函数就对最终的压缩数据(原始压缩数据与crc校验码)进行解压操作。
解压函数
int DeCompress(const unsigned char * src, long src_len, unsigned char * dest, long * dest_len)
{
z_stream stream;
int err;
if (crc32(0, src, src_len)