C-霍夫曼编码表如何在实践中构建



我的问题是特定的。我可以看到,霍夫曼编码的理论很容易理解。但是,似乎它创建了通常与字节边界不符的代码。减轻此特定问题的实际方法在我遇到的教程中尚未处理。

有两个问题:

(1)一旦对文件进行编码,则结果霍夫曼代码文件的文件结尾可能无法在字节边界处对齐。我们怎么知道我们已经在压缩文件中达到了Huffman编码数据的末端?

(2)规定,文件中包含一个霍夫曼表以帮助减压,这是在实践中如何创建的,因为我们再次遇到与字节边界不符?他们自己的符号可能是8或16位。但是,霍夫曼代码可以是任何数量的位。现在,如果我们每个代码中包含霍夫曼代码,我们还必须包括多少位,以便解码器可以使用Huffman表来创建二进制树或其他一些数据结构来帮助减压。

Huffman和算术编码似乎在许多压缩系统中都使用,因此这个问题不断弹出。

我试图了解如何在JPEG中完成此操作,并将使用NIOS II软核心处理器在FPGA中的C中构建编码器,以将JPEG文件从相机中保存在SD卡中。

  1. 其他符号定义为最终代码。当遇到该代码时,您已经到达流的末尾。除非有其他一些以下流,否则通常要做的就是丢弃最后一个字节中的任何剩余位,以转到下一个字节边界。

  2. 有很多方法可以根据压缩代码描述的重要性来改变复杂性。您可以以一种方式读取RFC 1951中的Deflate描述,以及RFC 7932中的Brotli描述。在这两种情况下,代码本身均未发送。取而代之的是发送每个符号的代码长度,并且代码本身是根据长度和符号顺序构造的。在Deflate中,为每个符号发送了长度,并为未编码的符号发送零长度。该系列的长度在跑步长度中编码,然后本身是霍夫曼编码的。 huffman代码首先发送代码长度,该代码长度是使用固定数量的每个长度(3)发送的,并再次构造。(查找规范的Huffman代码。)JPEG在不使用预定义的Huffman代码时具有另一种编码代码长度的方法。

最新更新