我正在尝试解码用Modified Huffman Coding编码的缓冲区。
这是缓冲区的开头:namespace Program001
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
comboBox1.Items.Add("E");
comboBox1.Items.Add("W");
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedItem == "E")
{
int hr = int.Parse(textBox1.Text);
int Zd = int.Parse(textBox3.Text);
int output = hr - Zd;
if (output <= 0)
{
int Q = output + 24;
textBox2.Text = Q.ToString();
}
else
{
textBox2.Text = output.ToString();
}
}
if (comboBox1.SelectedItem == "W")
{
int hr = int.Parse(textBox1.Text);
int Zd = int.Parse(textBox3.Text);
int output = hr + Zd;
if (output >= 24)
{
int Q = output - 24;
textBox2.Text = Q.ToString();
}
else
{
textBox2.Text = output.ToString();
}
}
}
}
}
从translation table看,似乎无法保证Modified Huffman所需的prefix属性。根据该表,我看到000111100001111011111010001000011101000011101000011110
表示00011
,但是7B
表示000111
。在这种情况下,如何解码上面的缓冲区?我读错了桌子还是我缺少的算法有些细微差别?
答案 0 :(得分:2)
改进的霍夫曼编码使用白色和黑色像素的交替编码。编码始终以白色像素开始。因此,在您的示例中,缓冲区解码为000111=1W
,10=3B
,000111=1W
,依此类推。
答案 1 :(得分:1)
经过修改的霍夫曼编码假定您从白色像素开始,如链接中的转换表所述。如果没有,则使用运行“ 0”白色像素的代码。
00110101 = 0W
000111 = 1W
and so on...
在您的示例中,您从1W 000111
开始,然后从3B 10
开始,依此类推...
正如约翰指出的那样,您的翻译表是错误的。 正确的表格可以在这里找到:Correct Modified Huffman Coding Translation Table