霍夫曼编码,保存代码和在C中编写二进制文件

时间:2016-10-18 16:01:00

标签: c algorithm tree huffman-code

我遇到使用Huffman编码文本文件的问题。 让我们说要编码的行如下:

AAAABBBCCAABBCCDFF

所以频率表是这样的:

A:6
B:5
C:4
D:1
F:2

所以我构建了一个树,结构是这样的:

typedef struct node {
    struct node *left;
    struct node *right;
    unsigned char character;
    unsigned int flag; //needed for nodes with no value in Huffman-tree
    unsigned int occurences;
} node; 

我知道代码应该是:

A: 10
B: 11
C: 01
D: 000
F: 001

现在我想从我的树中获取这些代码,我该如何轻松地做到这一点?

其次,我想保存这些代码,以便我可以轻松查看代码并将其写入二进制文件。

如何保存这些代码和写入,如何将单个(或2或3)位写入二进制文件,因为我知道C需要字节。

我想这样写(代码按字节排序,最后一个字节只有7位)

10101010 11111101 01101011 11010100 0001001 (only 7 bits)

1 个答案:

答案 0 :(得分:0)

此后是在文本文件中将位串编码转换为十六进制系列的示例。 sBoolText字符串已被'0'或'1'填充,并且必须通过为最后一个字节完成'0'来填充。

在您的情况下,“AAAABBBCCAABBCCDFF”将编码为101010101111 ... 001001并生成一个填充“0”的位串“101010101111 ... 001001”。

  

这不完全是您所需要的,但您可以使用fputc()代替   fprintf中()。

void BoolToHexFile(FILE *foutText,char *sBoolText)
{
    int i,j,len,res;

    len = strlen(sBoolText);
    for(i=0;i<len;i+=8) {
        res = 0;
        // build one byte with 8bits as characters
        for(j=0;j<8;j++) {
            res *= 2;
            if (sBoolText[i+j]=='1') res++;
        }
        // add a NewLine every 16 bytes
        if ((i % 128) == 0) fprintf(foutText,"\n");
        // store the byte as 2 hexa-digits
        fprintf(foutText,"%02X ",res);
    }
}