我目前正在研究一种自定义deflate算法,该算法应封装在来自 System.IO.Stream 的自定义类中。
我知道 是 DeflateStream 的.Net实现,但我也想完全理解算法需要实现它因为Silverlight我是什么我正在使用的不包括那个类。
我已经阅读了一些有关deflate的信息,并且了解deflate是 LZ77 和 Huffman-Encoding 的组合,并且已经花了一些时间用于 LZ77 实现,但现在确实有一些问题:
1)LZ77的输出是三元组列表(偏移,长度,后继)。将它们映射为三个字节效率不高,不是吗?你会建议什么?我将所有输出写入底层的 MemoryStream ,它只能处理(一组)字节。
2)您建议使用什么尺寸的滑动窗口?
3)我确实知道霍夫曼编码是什么,但我如何在这里应用呢?我的问题是,我不知道我需要用它来映射“块”的大小,并且没有找到任何关于此的信息。我是否为每个字节应用它?两个字节?三?我如何处理结果输出(与1中提到的相同的问题))?我想过使用一种继续读取字节并提取霍夫曼代码的状态机,但这似乎不是很有效。还有更好的方法吗?
提前谢谢!
答案 0 :(得分:0)
无法告诉您前两个点,但霍夫曼编码基本上是为序列中的每个符号生成二进制代码。代码长度取决于符号的频率。较短的代码适用于人群,而较长的代码适用于不受欢迎的人。这个想法就像:
abaaaaaaaaaabaaaaaaaabaaaaaaaaaaaaaa