我一直在研究LZSS压缩方案。我相信我已经掌握了它的窍门,但是当涉及到将数据实际编码为实际的位和字节时,我遇到了一些问题。具体来说,我知道文字字节前面有一个 1 位,而(偏移量,长度)对前面有一个 0 位(是的,我知道这也可以是相反的情况)。然而,使用这些位标志对数据进行编码可能会造成压缩数据最终的位数不是 8 的倍数的情况。该算法如何对此进行补偿?该算法是否只是在数据末尾附加适当数量的 0 位以确保位数是 8 的正确倍数?即使你这样做了,这也会对未来的减压者产生欺骗性的影响。假设您在压缩时必须在数据末尾添加三个 0。在这种情况下,解压缩器会将这三个 0 中的第一个解释为标志位(可能指示接下来的两个字节是偏移长度对,或者如果不是,则指示文字字节)。然后,解压缩器会非常困惑地发现数据流中只剩下两位,并且没有更多的完整字节可以解释为文字或一对。你如何处理这个问题?
我已经看到了将 8 位链接在一起形成一个完整字节(我们称之为标志字节)的想法,作为接下来 8 个条目的一组 8 个标志。然而,这个想法几乎遇到了同样的问题,不是吗?当需要编码的条目少于 8 个时会发生什么? (通过“条目”,我指的是文字字节和/或偏移长度对)。例如,如果只剩下 5 个条目,则无法将 5 位链接在一起并将其称为字节。在这种情况下你会怎么做?
我在一些来源中看到的另一个想法是通过将偏移量编码为 12 位、将长度编码为 4 位,从而将(偏移量、长度)对保持在 16 位。然而,这会将长度限制为 15,因为这是可以通过 4 个二进制位编码的最大数字。那么,对于编码模式长度超过 15 个字符的数据,这将如何工作呢?此外,这仍然没有解决标志位的问题。
有人可以帮我理解 lzss 压缩数据是如何编码的吗?我了解了 lzss 背后的理论,但对位和字节的实际编码对我来说似乎很奇怪。
总而言之,这是我目前对 lzss 中数据编码的理解:
如果您遇到一个文字字节,那么您只需在前面添加一个 1(或 0)位标志,然后按原样输出该字节。
如果遇到偏移长度对,则在前面添加一个 0 位(或 1),然后输出两个字节(首先是偏移量,然后是长度)。示例:如果我遇到偏移长度对 (4, 7),那么我的编码数据应如下所示: 0(bit) 0x04 0x07 以位为单位,这将转换为以下 17 位:00000010000000111
我的理解正确吗,还是我遗漏了什么?
如果文字字节前面有 1 位,那么您可以简单地将最后一个字节中的剩余位填充为 1 位。它后面不能有八位,所以你知道你已经完成了。它不能被误解为偏移量/长度或文字。