【问题标题】:LZ77 and escaping characterLZ77 和转义字符
【发布时间】:2018-10-15 03:18:29
【问题描述】:

我正在尝试实现LZ77压缩算法,遇到了这个问题。

我正在逐字节压缩输入(可以是任何二进制文件,而不仅仅是文本文件),并且我使用 3 个字节来表示对先前子字符串的指针/引用。指针的第一个字节总是一个转义字符,b"\xCC",为了方便起见,假设它是 C。

我在使用转义字符时所知道的“标准”方式是,您通常对所有其他字符进行编码,并转义与转义字符具有相同值的文字。所以'ABCDE'编码为'ABCCDE'。

问题在于,指针的值可能是“CCx”,其中第二个字节可能是“C”,这使得指针无法与转义文字“CC”区分开来,这会导致问题。

我该如何解决这个问题?或者 LZ77 的正确/标准方法是什么?谢谢!

【问题讨论】:

  • 为什么会有问题?如果指针的长度是固定的,那么您只需读取它(并忽略其中的转义字符)。如果它不是固定长度,那么您需要以某种方式对长度进行编码。如果这没有帮助 - 您能否通过有效和无效的示例来阐明转义方案?
  • 例如,我们正在解压内容“CCD”,程序无法判断它是文字C,被C转义,后跟文字D还是值为“CD”的指针

标签: algorithm encoding compression ascii html-escape-characters


【解决方案1】:

要使 LZ77 有用,它需要跟一个熵编码器。正是在该步骤中,您将符号编码为压缩数据中的位。

一种方法是定义 258 个符号,其中 256 个用于文字字节,一个表示后面是匹配的长度和距离,一个表示流结束。

或者你可以做 deflate 所做的事情,即将长度和文字编码在一起,以便该符号解码为文字字节或长度,其中长度意味着距离代码后面。

或者你可以做 brotli 所做的事情,即定义“插入和复制”代码,它给出文字的数量,然后是那么多文字代码,然后是复制长度和距离。

或者你可以自己发明。

【讨论】:

    猜你喜欢
    • 2016-04-15
    • 2013-02-21
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多