我正在实现lzw的一个版本。假设我从10位代码开始,每当我最大化代码时都会增加。例如,在1024个代码之后,我将需要11位来表示1025.问题在于表达移位。
如何告诉解码我改变了代码大小?我想过使用00,但程序无法区分00作为增量而00只作为代码零的两个实例。
有什么建议吗?
答案 0 :(得分:2)
你没有。字典已满时,您将切换到新大小。解码器的字典与编码器的字典同步建立,因此它们将同时满,并且解码器将在编码器时完全切换到新的大小。
您必须发送代码来表示更改的时间是您完全填写字典时 - 您已经使用了所有可用的最大代码。在这种情况下,通常希望继续使用字典,直到/除非压缩率开始下降,然后清除字典并重新开始。你确实需要放入一些标记来判断发生的时间。通常,您为此目的保留了单个最大的代码,但任何不用于任何其他目的的代码都可以使用。
编辑:顺便说一下,请注意,您通常希望从比输入代码大一点的代码开始,因此如果您要压缩8位字节,则需要以9位代码开头。 / p>
答案 1 :(得分:1)
答案 2 :(得分:1)
为2 n -1创建代码时,增加位数。因此,当您创建代码1023时,请立即增加位大小。您可以从GIF compression scheme获得更好的说明。请注意,这是一项专利计划(部分原因是PNG的创建)。该专利可能已经到期了。
答案 3 :(得分:0)
由于解码器与压缩器构建相同的表,因此在达到最后一个元素时(例如,在您的示例中为1023),其表格已满,因此,解码器知道下一个元素将是11位。