algorithm - LZ77 和转义字符

标签 algorithm encoding compression ascii html-escape-characters

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

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

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

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

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

最佳答案

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

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

或者您可以执行 deflate 所做的操作,即同时对长度和文字进行编码,以便该符号解码为文字字节或长度,其中长度表示后面是距离代码。

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

或者您可以自己发明。

关于algorithm - LZ77 和转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52809319/

相关文章:

python - 如何在剔除不良序列的同时生成排列?

Java:InputStreamReader字符编码需要运行两次

python - 使用 NLTK 无法使用 Unicode 字符标记西类牙语文本?

c++ - 如何链接 zlib 库

c# - 如何仅使用跟踪的更改来压缩文件?

algorithm - 如何缩放和加权给定值的适应度?

c - 如何使用递归来确定图中两个节点之间是否存在路径?

python - 给定文件数和深度生成随机目录/文件

c++ - C++ Base64图像文件编码

任何人都可以对这个 spigot 算法代码 Pitiny.c 有所了解或讲故事吗?