这个就需要了解下snappy原理
压缩过程
变量声明
const char * input; 输入的待压缩的二进制串
unsigned int input_size; 输入的二进制串的字节数
char * output; 压缩后的数据存放位置
unsigned short table[]; 存放input_cur之前的每个字节开始的uint32的偏移,其下标与前边uint32的hash值对应。使用之前必须全部清0.
偏移:匹配开始位置距离串首的长度
第一步:将输入串的大小input_size存储在输出串output的前1-5个字节,将输入的串分割成32k大小的串,循环取出各块进行压缩
第二步:将输出位置emit_next设置为串首,即exmit_next = input,串比较位置ip_next设置为当前位置
第三步:拿到ip_next开始的4个字节转换成uint32然后hash
第四步:将emit_next加上hash值对应table的下标中的值赋给指针candidate
第五步:将当前位置的偏移赋给table[hash]
第六步:比较candidate处开始的四个字节转换成uint32与当前位置的uint32是否相等,若相等,执行第七步,否者ip_next自增1,执行第三步
第七步:将emit_next和ip_next之间串的长度和内容存储到output中
第八步:查找当前位置开始的串与candidate开始的串的最大匹配长度matched
第九步:存储匹配信息,包括匹配长度和偏移
第十步:candidate前移mathed长度
第十一步:查看candidate处是否匹配,若匹配,转到第八步;否则emit_next = candidate,ip_next = candidate,执行第十二步
第十二步:检查是否到了串尾,若是则退出,否则转到第三步
更多参考
snappy压缩过程详解.zip
(69.63 KB, 下载次数: 1)
|