技术

游程编码 RLE 是什么:用重复计数压缩连续相同字节

📅 2026-09-10 · ✍️ 闪压技术团队 · ⏱ 5 分钟阅读

一句话定义:把"长串重复"换成"一个数字"

游程编码(Run-Length Encoding,简称 RLE)的核心思路,只有一句话——当一段字节里出现了连续重复的值,就不要再原样存这一长串,只记两件事:这个值是什么、连续出现了几次

举个最直观的类比。你在文档里写一行横线分隔内容,过去你要打几十个 -;用 RLE 的思路,你只需要在心里默念"短横线,连续若干个",然后由压缩器把它还原成一长串。算法不知道原始长度有多长,它只知道"某个值连续重复了多少次",这是 RLE 与所有其他压缩算法最不一样的地方:它不找模式、不查字典、不算概率,只数"连号"。

这就是为什么 RLE 在计算机压缩历史上属于"最容易讲清楚的一类算法"——逻辑单一步骤少,实现也短小,几十行代码就能写完。它通常被当成教学示例,是后续 LZ 系列、字典编码、BWT 等更复杂方法的"入门台阶"。如果你想了解 LZ77 这类更进阶的字典压缩原理,可以参考这篇文件压缩算法科普

工作方式:滑动窗口里的"计数器"

把 RLE 想象成你拿着笔在纸上边走边数。从第一个字节开始,你盯着当前字符,数它连续出现了几次,记下"值 + 次数"作为一对输出。然后跳到下一段,继续数。当字节流里出现不同值,就开新一对。

具体步骤,通常是这样:

  • 准备一个空输出列表。
  • 指针从数据开头出发,看当前字节的值是什么。
  • 沿着字节流往后走,只要下一个字节和当前相同,计数器就加一。
  • 一旦遇到不同的字节,就把"当前值 + 计数器"作为一对写到输出里。
  • 把指针移到新字节位置,重复上述过程,直到走完整个数据。

输出格式因实现而异。最朴素的做法是"每对占两个字节",一个存值、一个存计数;复杂的实现会把连续重复很长(计数器放不下)的情况拆成多对,或者对计数本身再做变长编码节省空间。但所有变体都共享同一个核心——把"重复的量"压缩成"一个数字"

需要区分的一点是:RLE 不压缩"出现过两次的非连续重复",比如 ababab 这种交替重复,字符 ab 单独都不连续,计数器永远是 1,RLE 反而会让输出比输入更长——这种情况属于字典编码的菜,不是 RLE 的强项。

适用场景:RLE 真正擅长的是"短重复"

RLE 不是万能的。它的战场很清晰:数据里有大量相邻重复。几个典型场景:

  • 图像里大片相同颜色的色块,例如屏幕截图里的大块白底、漫画里的纯色块、像素画里的色块重复。
  • 传真和早期扫描文档里的黑白二值图,经常出现大段连续白像素或黑像素。
  • 简单图标、UI 截图、CAD 图纸里的重复色块。
  • 文本里偶尔出现的长串空格、缩进、连续重复字符。

反过来,RLE 在以下场景基本"无效甚至有害":

  • 已经是压缩过的格式,例如 JPEG、PNG、WebP、MP4、MP3——这些格式已经把相邻重复处理过,RLE 再扫一遍几乎找不到长游程。
  • 高度随机数据,例如加密后的密文、压缩包、办公文档的二进制部分,字节分布接近均匀,找不到长游程,反而因为每对至少占两字节而把体积撑大。
  • 数据本身重复但不连续,例如人写代码、英文文本,字符种类多、连续重复短。

所以实践中 RLE 几乎从不单独使用,常常作为某大型压缩流程的"前置小工具"——先用 RLE 把超长游程吃掉,再交给后面的字典编码或熵编码继续压。它最大的价值,是用极低的实现成本,把数据里那种"一眼就能看出来"的浪费先解决掉

如果想进一步了解 RLE 之外、同样属于"无损压缩"思路的另一大类算法,可以看这篇无损压缩与有损压缩的核心区别

RLE 与闪压日常工作的关系

闪压作为桌面压缩工具,默认走的是综合压缩流程:在文件压缩、压缩包解压这类场景里,你拿到的是已经被组织好的归档格式——ZIP、7Z、RAR 等,这些格式内部已经包含了它们自己的字典与熵编码,不会再单独调用 RLE。

但如果你的数据是自定义的、未经任何压缩的原始流(例如自己脚本生成的日志、设备导出的二进制大块),RLE 这种"数连号"思路就是一个值得放在流水线前端的轻量步骤:先用极快的方法把长重复吃掉一部分,再交给通用压缩器继续压,在很多自定义场景里能让最终体积进一步缩小,而又几乎不增加运行时间。

这正是理解 RLE 价值的关键——它不是"代替"LZ77、霍夫曼或算术编码,而是和它们配合:用最简单的数法把最显眼的浪费吃掉,再用更复杂的算法处理剩下的细节。这是数据压缩领域一个很常见的工程取舍:单一算法难求最优,组合流水线常常更接近极限

一段话回顾

游程编码 RLE 的本质,是把"连续重复的字节"压缩成"值+计数"两件事。它逻辑简单、实现短小、运行快,但只在数据里真有"长串相同字节"时才有效。它常作为综合压缩流程的前置步骤,而不是独立使用。当你看到一段字节里有大片重复,先想想 RLE,这种"先用最便宜的方法收拾最显眼的浪费"的思路,在数据压缩里其实无处不在。

相关阅读: 文件压缩算法科普 · 无损压缩与有损压缩的核心区别

标签

技术游程编码RLE无损压缩压缩算法原理数据压缩

喜欢这篇?下载闪压试试

完全免费 · 本地处理 · 无广告

立即下载闪压
客服