RLE与BZ/BZW——两种算法哲学

💡 原文中文,约2800字,阅读约需7分钟。
📝

内容提要

本文比较PS2的PRLE与BZ/BZW压缩:RLE以“值+重复次数”编码连续重复数据,LZSS用回溯引用复用历史片段。PRLE用字面量块处理非重复数据,BZ用控制掩码,纯明文渐近开销约12.5%。两者无优劣,取决于数据分布与格式设计,理解它们有助于复古游戏逆向与资源解包。

🔎

延伸解读

RLE与LZSS:互补而非替代

文章指出RLE和LZSS利用不同的数据特征:RLE针对连续重复值,LZSS利用历史重复片段。两者没有绝对优劣,实际压缩效果取决于数据分布。例如,大片相同颜色适合RLE,而文本或结构化数据可能更适合LZSS。理解这一点有助于在逆向工程中正确识别压缩格式。

非重复数据的处理差异

对于完全不重复的数据,PRLE通过字面量块减少逐值开销,但仍有固定控制开销;BZ/BZW使用控制掩码,每8个明文共享1个控制字节,渐近开销约12.5%。文章强调,12.5%仅是纯明文编码的渐近开销,实际膨胀率还受引用编码、结束标记等因素影响。

膨胀率对比的定性分析

文章对比了PRLE和BZ/BZW在不同数据特征下的表现:长段连续相同值PRLE通常有效,BZ/BZW也可能有效;远距离重复片段PRLE通常不能直接利用,而BZ/BZW可以利用回溯引用但受窗口限制。这提醒我们,不能简单断言哪种算法压缩率更高,需结合具体数据分布和格式设计。

复古游戏逆向中的实际意义

在Dreamcast和PS2时代,资源压缩需权衡压缩率、解压速度、内存占用和实现复杂度。理解RLE和LZSS变体有助于编写解包器,避免混淆压缩格式、资源封装和图像编码。逆向工程的价值在于从简单指令中还原开发者的约束与选择。

❓

Q&A

RLE和LZSS在压缩思路上有什么根本区别?

RLE关注连续重复的数据,用“值+重复次数”编码;LZSS关注数据与历史内容之间的重复关系,通过回溯引用来表示,即使重复片段相隔很远也能利用。

PS2的PRLE如何处理不重复的数据?

PRLE使用字面量块(Literal Block)机制,用一条指令表示一整段不重复的数据。例如,一段长度为5的字面量块会有一个控制word标记非重复块和长度,后面跟着5个数据word。

BZ/BZW压缩算法中控制掩码的作用是什么?

BZ/BZW通过控制掩码区分明文与引用。以BZ为例,一个控制字节可以标记接下来的8次解码操作,其中每个位表示对应的操作是明文还是引用。

BZ算法对纯明文数据的渐近额外开销是多少?

对于连续的纯明文数据,每8个字节共用1个控制字节,渐近额外开销为1/8,即12.5%。

PRLE和BZ/BZW分别适合压缩什么样的数据?

PRLE适合大片相同颜色、填充值等连续重复值多的数据;BZ/BZW适合文本、结构化数据、重复图案等存在历史重复片段的数据。

为什么说RLE和LZSS没有优劣之分?

因为压缩效果取决于数据分布、引用编码、窗口大小和格式设计。RLE对连续重复值高效,LZSS能利用远距离重复片段,两者服务于不同的数据特征,没有绝对优劣。

🏷️

标签

➡️

继续阅读