哈夫曼编码、保存代码和用C编写二进制文件
我用哈夫曼编码文本文件时遇到问题。 假设要编码的行如下所示:哈夫曼编码、保存代码和用C编写二进制文件,c,algorithm,tree,huffman-code,C,Algorithm,Tree,Huffman Code,我用哈夫曼编码文本文件时遇到问题。 假设要编码的行如下所示: 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
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位)
下面是一个将编码的位字符串转换为文本文件中的十六进制序列的示例。sBoolText字符串已由“0”或“1”填充,必须通过为最后一个字节填写“0”来填充 在您的情况下,“aaaabbbccaabccdff”将编码为101010101111…001001,并生成填充有“0”的位字符串“101010101111…001001” 这并不完全是您所需要的,但您可以使用fputc()而不是 fprintf()
void BoolToHexFile(FILE*foutText,char*sBoolText)
{
int i,j,len,res;
len=strlen(sBoolText);
对于(i=0;i以下是一个将编码为文本文件中十六进制序列的位字符串转换为文本文件的示例。sBoolText字符串已由“0”或“1”填充,必须通过在最后一个字节中填充“0”来填充
在您的情况下,“aaaabbbccaabccdff”将编码为101010101111…001001,并生成填充有“0”的位字符串“101010101111…001001”
这并不完全是您所需要的,但您可以使用fputc()而不是
fprintf()
void BoolToHexFile(FILE*foutText,char*sBoolText)
{
int i,j,len,res;
len=strlen(sBoolText);
对于(i=0;iYou可以通过一个构建静态字节的函数来推送位。当它有8位时,它会被写入文件。类似地,对于回读,函数会从一个字节中提取1位,当没有剩余时,会从文件中读取另一个字节。@WeatherVane有可能显示一个这样的例子吗?@fangio为了有一个更容易检查的结果,我经常使用使用字符串将位存储为“0”或“1”ASCII值。然后,您只需将结果字符串剪切为8个字符长,并在写入文件之前将每个字符转换为一个字节。@fangio您可以试一试-这并不太难。您可以通过一个构建静态字节的函数来推送位。当结果字符串有8位时,它将写入文件。类似地为了读回,函数从一个字节中提取1位,当没有剩余字节时,从文件中读取另一个字节。@WeatherVane是否可以给出一个这样的例子?@fangio为了得到更容易检查的结果,我经常使用字符串将位存储为“0”或“1”ASCII值。然后,您只需将结果字符串剪切为8个字符并进行转换在写入文件之前,请将每一个字节转换为一个字节。@fangio您可以试一试-这并不太难。您能解释一下((i%128)==0)fprintf(foutText,“\n”);您能解释一下((i%128)==0)fprintf(foutText,“\n”);
10101010 11111101 01101011 11010100 0001001 (only 7 bits)
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);
}
}