- 论坛徽章:
- 0
|
做一个哈夫曼编码的小程序,开始用递归方法查表进行解码,正常;后来试试不用递归来写,就改了一下。。。发现。。。。结果不同,凭空多出一个字节?!用cmp比较。。。报告"cmp: EOF on ...",怎么回事儿??
后来输出每一个保存到文件里字节,发现两种写法的输出完全一样,字节数也一样,可是。。。费解的就是非递归方法产生的文件就是会多一个字节,而且用winhex看不到那个字节。。。。。基本上愤怒的要崩溃了。。。。求大侠指点。
相关的定义部分
- typedef unsigned char Symbol; /* any byte is encodable */
- typedef struct HuffNode *HuffTree;
- struct HuffNode {
- Bool isExt; /* is this an external node? */
- Symbol sym; /* defined if isExt only */
- HuffTree branch[2]; /* defined if !isExt only */
- };
- // Open bit stream for reading from fp
- BitStream BitStream_OpenRead(FILE *fp);
- // Open bit stream for writing to fp
- BitStream BitStream_OpenWrite(FILE *fp);
- // Transfer nbits (0..CHAR_BIT) from data to bs
- void BitStream_Put(BitStream bs, unsigned char data, int nbits);
- // Return nbits (0..CHAR_BIT) from bs
- unsigned char BitStream_Get(BitStream bs, int nbits);
复制代码
递归版本
- static unsigned char traverse_and_decode(HuffTree t, BitStream bs){
- if (t->isExt == FALSE){
- int j = BitStream_Get(bs, 1);
- return traverse_and_decode(t->branch[j], bs);
- }
- return t->sym;
- }
- void HuffTree_Decode(HuffTree t, FILE *fin, FILE *fout, int num_bytes)
- {
- int i;
- BitStream bsi, bso;
- bsi = BitStream_OpenRead(fin);
- bso = BitStream_OpenWrite(fout);
- for (i=0; i<num_bytes; i++)
- BitStream_Put(bso, traverse_and_decode(t, bsi) , CHAR_BIT);
- BitStream_Close(&bso);
- BitStream_Close(&bsi);
- }
复制代码
非递归版本
- void HuffTree_Decode(HuffTree t, FILE *fin, FILE *fout, int num_bytes)
- {
- int i, j;
- HuffTree tt;
- BitStream bsi, bso;
- bsi = BitStream_OpenRead(fin);
- bso = BitStream_OpenWrite(fout);
- for (i=0; i<num_bytes; i++){
- tt=t;
- while (tt->isExt==FALSE){
- j = BitStream_Get(bsi,1);
- tt=tt->branch[j];
- }
- BitStream_Put(bso, tt->sym, CHAR_BIT);
- }
- BitStream_Close(&bso);
- BitStream_Close(&bsi);
- }
复制代码 |
|