RLE压缩算法C#详细教程
一、前言
什么是RLE算法
RLE(Run LengthEncoding)行程长度压缩算法是一个简单高效的无损数据压缩算法,其基本思路是把数据看成一个线性序列,而这些数据序列组织方式分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块。
RLE算法的原理为,以一个表示块数长度的属性字节加上一个数据块,来代表原来连续的若干块数据,从而达到节省存储空间的目的。
本篇目的
- 尽可能描述RLE算法的原理
- 给出RLE算法的C#实现
开发环境
- 操作系统: Windows 10 X64
- SDK:NET Framework 4.7.2
- IDE:Visual Studio 2019
二、RLE算法原始方法及其变体解释
1.原始RLE算法
为了更直观地说明RLE算法,接下来使用示例数据进行演示
例:原始数据为:
A A A A A B B B B C C D E F
压缩后数据为:
5 A 4 B 2 C 1 D 1 E 1 F
原始算法进行压缩时,将逐个读取待压缩数据,若某个字节后有重复的字节,则重复计数加1,直到找到一个不重复字节时,将当前计数器中的值存入数据重复次数字节,对应的该字节的数据存放在其后的数据字节中,然后将计数器重置,继续使用相同方式读取剩下的未压缩数据。
由于数据重复次数的单位是一个字节,故最大值为255,因此若是数据序列的某一个数据重复次数大于255,当计数器值到达255时就需要将计数器值和当前数据值分别写入数据重复次数字节和数据字节中,然后计数器重置继续读取数据,直到到达文件末尾。
原始算法压缩完毕后的格式十分简单,即为:[重复次数] [数据字节] [重复次数] [数据字节]。因此解压缩时只需要读入重复次数n,再将其后的字节重复输出n份,再读入重复次数m,将其后的字节重复输出m份…以此类推循环往复,直到到达文件末尾,解压缩完毕。
2.RLE算法变体一
原始算法原理简单操作方便,但存在一个巨大的问题:如果需压缩的原始数据重复率很低,出现了连续的不重复数据,进行压缩反而会因为加入了太多的数据重复次数字节而导致数据膨胀,甚至变为原本长度的两倍,与压缩的目的背道而驰。因此针对这种情况,人们对算法进行了改进,即为,对连续出现的不重复数据不再简单插入块数属性,而是将其直接输出作为压缩后的数据。
但直接输出仍存在一个问题,由于解压缩时需要对压缩数据进行判断,判断其究竟是数据重复次数字节还是原始数据字节,因此在开头定义一个特殊字符作为数据重复字节的标志,每当需要数据重复次数字节时便在重复次数字节前插入特殊字符
同样以例子进行说明:
原始数据为:
A A A A A B B B B C C D E F
压缩后数据为:
T T 5 A T 4 B T 2 C D E F
此处特殊字符为T
这样在出现大量连续不重复数据时,就不会因为插入数据重复字节导致数据膨胀
这种变体的解压方法也很简单,压缩完毕后逐个读取字节,当读取到特殊字节时,其后一位字节作为数据重复次数n,再将重复字节后的数据字节输出n份,若没有读取到特殊字节,就作为不重复数据直接输出并继续读取直到文件末尾。
3.RLE算法变体二
上述压缩算法及变体1都存在一个问题,即解压缩时需要对每一个字节进行判断,区分它是重复次数字节还是数据字节,又或是特殊字符,在处理不重复字节时都是单个单个处理而非整体处理。因此变体2的改进即为,无论是重复或是不重复字节都各自作为一个整体来处理,在数据块前添加数据重复次数字节,通过重复字节的最高位来判断后跟的数据重复或是非重复。
例:
原始数据为:
A A A A A B B B B C C D E F

最低0.47元/天 解锁文章
475

被折叠的 条评论
为什么被折叠?



