霍夫曼代码压缩

时间:2014-03-22 15:56:47

标签: c++ algorithm compression huffman-code

我正在做霍夫曼编码的任务。我已经设法从文本文件构建字符频率树,为每个字母生成0和1的代码,使用代码将文本文件写入另一个文件,并解码代码句。

我的目标是实现以下目标:

压缩:将0和1的字符串分解为8位块,并写入字符 由每个块表示为压缩文件。 通过用表示它所需的8位替换每个字符来解码。

我不确定如何将其压缩成8位块。

1 个答案:

答案 0 :(得分:0)

您必须跟踪两种状态:您为每个字符编写的位,其数量将根据树中的字符级别和您写入的8位块而变化。您需要在位级别上调整输出块。

有各种方法。这是一种解决方案,通过移位数据位并将该位写入来一次写入一个位。当数据位满时,它被写入8位块输出接收器。下面的代码检查数据位溢出的bitinel位,最终移出8位范围:

static unsigned int out = 0x01;

void write_bit(bool bit)
{
    out <<= 1;                    // shift byte to make room
    if (bit) out |= 0x01;         // set lowest bit id desired

    if (out & 0x100) {            // was the sentinel bit shifted out?
        write_byte(out & 0xff);   // final output of 8-bit chunk
        out = 0x01;               // reset to sentinel vylue
    }
}

void flush_bit()
{
    while (out != 0x01) write_bit(false); 
}

int main()
{
    write_bit(1);
    write_bit(0);
    write_bit(1);
    // ...
    flush_bit();

    return 0;    
}

flush()确保通过用零位填充霍夫曼序列来写出仍在数据字节中的位。

实际位输出的工作原理如下:

  0000 0001    // initial state: one sentinel bit
  0000 0011    // after writing a 1
  0000 0110    // after writing a 0
  1101 1111    // after writing five more 1s
1 1011 1110    // after writing a 0: data byte is full
               // write 1011 1110 to final output
  0000 0001    // reset data byte

为此,数据位必须存储在一个整数中,该整数可以容纳多于一个字节的位。

您还可以使用单独的变量跟踪字节状态。逐个写位可能效率不高,但很简单。