从shannon fano编码算法生成的代码的解码

时间:2011-06-08 05:32:49

标签: c++ cryptography compression

我使用shannon fano算法生成了文件中不同符号的代码。 现在我的问题是我将如何将这些代码存储到文件中(因为文件是以字节为单位),以便在阅读时,读者可以确保在某些时候,它是特定符号的代码结束。因此不会读取额外的代码。

1 个答案:

答案 0 :(得分:3)

首先,您可以使用按位运算从字节数组中读取可变数量的位(不是8的倍数)。

其次,如果代码是有效的Prefix code,则满足

there is no valid code word in the system that is a prefix (start) of any other valid code word in the set

然后您可以通过将前缀与表格进行比较来确定代码的结束位置。


通常,这是通过以下方式完成的:

  • 假设代码长度为1到16位。
  • 将文件的下16位加载到变量中。
  • 将16位变量与包含以下值的表进行比较。可以使用二进制搜索或基数搜索。
    • Key:Shannon-Fano或Huffman代码,移位使得最高位位于最高位。
    • KeyLength:Shannon-Fano或Huffman代码中的实际位数。这允许我们从变量中减去解码位的数量。
    • 值:代码将解码的值。
  • 根据代码从变量中减去(移除)解码的位。例如,如果代码有9位,我们将从MSB中删除9位并保留剩余的7位。
  • 从文件中读取下一个9位,与未解码的7位连接。
  • 重复此过程。