在网络传输过程中,如果遇到体量较大的数据,我们一般采用压缩算法,实现减少带宽占用的做法。
GZIP
gzip是GNUzip的缩写,最早用于UNIX系统的文件压缩。
GZIP 的核心是 Deflate,Deflate 是一个同时使用 LZ77 与 Huffman Coding 的算法。
原理
gzip 对于要压缩的文件,首先使用LZ77算法的一个变种进行压缩,对得到的结果再使用Huffman编码的方法进行压缩。
LZ77
核心思路是如果一个串中有两个重复的串,那么只需要知道第一个串的内容和后面串相对于第一个串起始位置的距离 + 串的长度。
比如: ABCDEFGABCDEFH → ABCDEFG(7,6)H。7 指的是往前第 7 个数开始,6 指的是重复串的长度,ABCDEFG(7,6)H 完全可以表示前面的串,并且是没有二义性的。
Huffman
核心思路是通过构造 Huffman Tree 的方式给字符重新编码(核心是避免一个叶子的路径是另外一个叶子路径的前缀),以保证出现频路越高的字符占用的字节越少。
实现
下面介绍的是在golang里如何使用gzip实现解压缩操作
1 | package compressor |
测试如下:
1 | package compressor |
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2022/11/29/golang-comporess/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!