70,023
社区成员




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);
}