把连续重复缩成值与长度

在一般字符序列中,一段连续的相同值可以表示为“值、次数”。例如连续许多个A,只需保存A及其重复长度,解码时再按次数输出。游程关注相邻重复,不会仅因同一字符散布在文件各处就直接合成一段。

二值序列还可约定0和1交替出现,只存每一段的长度。Princeton示例从0段开始,因此输入若以1开头,需要先写一个长度零的0段,才能让解码者的交替次序正确。

参考:[1]

计数位数决定怎样切分长段

若用8位无符号计数,单次只能表示0到255。Princeton的交替位段实现遇到更长同值段时,写出255,再插入一个零长度的相反值段,随后继续计数原值;这样既不溢出,也不错误地改变实际输出比特。

其他格式可以保存显式符号、使用可变长度计数或特殊转义规则,不能把某个例子的零长度技巧当成全部游程编码共同的字节格式。编码与解码必须对最大长度、段切分和结尾约定保持一致。

参考:[1]

重复越短,计数开销越明显

若比特几乎每次都交替,原来一个比特的信息可能需要一个完整计数字节来表示,输出反而扩大。长重复段才有机会用少数计数替代大量原始项,因此压缩效果取决于数据的连续结构。

某些压缩流程先重排或变换内容,让相同符号更容易相邻,再使用游程编码。即便解码结果精确,损坏的计数也可能造成很长的错误展开;需要限制输出大小或检测传输错误时,还要由格式及外层协议另作安排。

参考:[1] [2]