【问题标题】:Questions about custom Deflate implementation in C#关于 C# 中自定义 Deflate 实现的问题
【发布时间】:2011-07-20 09:54:07
【问题描述】:

我目前正在研究一种自定义放气算法,该算法应封装在派生自 System.IO.Stream 的自定义类中。

我知道是一个 DeflateStream 的 .Net 实现,但我也想完全理解算法,因为我需要实现它,因为 Silverlight am using 不包括该类。

我已经阅读了一些关于 deflate 的信息,但不明白 deflate 是 LZ77 和 Huffman-Encoding 的组合,并且已经为 LZ77 花费了一些时间em> 实施,但现在确实有一些问题:

1) LZ77 的输出是一个三元组列表(偏移量、长度、后继)。将它们映射为三个字节不是很有效,不是吗?你有什么建议?我将所有输出写入底层 MemoryStream,它只能处理(一组)字节。

2) 您建议滑动窗口使用什么尺寸?

3) 我知道什么是霍夫曼编码,但我该如何应用它呢?我的问题是我不知道我需要用它映射什么大小的“块”并且没有找到任何有关此的信息。我是否为每个字节应用它?两个字节?三?以及如何处理结果输出(与 1 中提到的问题相同)?我曾想过使用一种状态机来继续读取字节并提取霍夫曼代码,但这似乎效率不高。有没有更好的办法?

提前谢谢你!

【问题讨论】:

  • 你在 C# 上实现过 deflate 算法吗?可以分享一下吗?

标签: c# algorithm


【解决方案1】:

前两点无法告诉您,但霍夫曼编码基本上是为序列中的每个符号生成二进制代码。代码长度取决于符号的频率。较短的代码用于流行,较长的代码用于不受欢迎的代码。这个想法是这样的:

abaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

  1. 使用 1 表示“a”
  2. 使用 01 表示“b”

【讨论】:

  • 是的,没错。我的问题不是我不知道它一般是如何工作的,而是如何在这里应用它。当我只处理二进制数据时 - 我是否必须为一个“符号”(就像一个或两个字节)设置一个固定大小,或者有没有办法以编程方式定义它们?我如何计算它们?我真的需要计算每个字节吗?这对大文件有什么作用?必须有一种有效的方法来做到这一点......
猜你喜欢
  • 2011-03-28
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2011-01-26
  • 2016-07-31
  • 1970-01-01
相关资源
最近更新 更多