我遇到使用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)
答案 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);
}
}