我是逆向工程的东西,我经常偶然发现各种解压算法。大多数时候,这是lzs,就像维基百科描述的那样:
初始化大小为2^n的字典
当输出小于已知输出大小时:
读取标志
如果设置了标志,则输出文本字节(并将其追加到字典末尾)
如果未设置标志:
阅读长度和向后看位置
将长度字节从字典的look behind位置转录到输出和字典的末尾。
问题是,实现遵循两种方法来编码标志。第一个将输入视为位序列:
(…)
读取标志为一位
如果已设置,则将文字字节读取为8个未对齐位
如果未设置,则将长度和位置读取为n和m个未对齐位
这涉及到很多位移位操作。
另一种方法只对标记存储使用按位操作,节省了一点CPU时间,而文字字节、长度和位置是从对齐的输入字节派生的。为了实现这一点,它通过预先获取几个标志来打破线性。所以算法修改如下:
(…)
通过读取一个字节,一次读取8个标志。对于这8个标志中的每一个:
如果已设置,则将文字读取为对齐字节
如果没有设置,则读取长度和位置作为对齐字节(从获取的字节中获取特定值涉及一些位操作,但没有任何地方比第一个版本更昂贵)
我的问题是:这两个lzss实现都是有效的,还是我发现这些算法是错误的?有他们的名字吗?
最佳答案
它们实际上是lzs上的变体,因为它们都使用一个位来决定文本与匹配。一般来说,它们是LZ77的变体。
deflate也是lz77上的一个变体,它不使用整位来进行文本与匹配。相反,deflate只有一个用于文字和长度组合的代码,因此代码隐式地确定下一个是文字还是匹配。长度码后面跟着一个单独的距离码。
lz4(一种特定的算法,而不是一个系列)以不同的方式处理字节对齐,对文本的数量进行编码,而文本的数量后面必须有匹配第一个字节的字面值也有一部分距离文字是字节对齐的,文字后面的偏移量和距离的其余部分也是字节对齐的。
关于algorithm - 这两种算法都是LZSS的有效实现吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32214469/