📄 decode.cpp
字号:
#include<stdio.h>
#include<malloc.h>
/* 定义头文件结构 */
#define MAXNUMBER 200*1024
typedef unsigned short BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef struct
{
unsigned short hfType;
unsigned int hfSize;
unsigned short FileNameLength;
unsigned char SourceSignalNum;
unsigned short hfOffBits;
unsigned char ValidDataBitsNum;
}HUFFMANFILEHEADER;
/* 定义码表结构 */
typedef struct
{
unsigned char SourceSignal_CodeLength;
unsigned short int CodeBits;
}HUFFMANTABLE;
typedef HUFFMANTABLE TABEL[17];
//读数据
void readfile(HUFFMANFILEHEADER *Header,unsigned char Huffmancode[],TABEL Tabel,char DepressFileName[])
{ unsigned char ch;
FILE *fp;
int i;
char filename[10];
printf("Please input the infile name:\n");
scanf("%s",filename);
fp=fopen(filename,"rb");
fread(&Header->hfType,sizeof(unsigned short),1,fp);
fread(&Header->hfSize,sizeof(unsigned int),1,fp);
fread(&Header->FileNameLength,sizeof(unsigned short),1,fp);
fread(&Header->SourceSignalNum,sizeof(unsigned char),1,fp);
fread(&Header->hfOffBits,sizeof(unsigned short),1,fp);
fread(&Header->ValidDataBitsNum,sizeof(unsigned char),1,fp);
printf("\nThe header of this huffman struct:\n\n");
printf("hfType=%c %c\n",Header->hfType>>8,Header->hfType&255);
printf("hfSize=%4d\n",Header->hfSize);
printf("FileNameLength=%4d\n",Header->FileNameLength);
printf("SourceSignalNum=%4d\n",Header->SourceSignalNum);
printf("hfOffBits=%4d\n",Header->hfOffBits);
printf("ValidDataBitsNum=%4d\n",Header->ValidDataBitsNum);
//读码表
printf("\nThe tabel of the hoffman code:\n\n");
unsigned short int temp=0;
for(i=1;i<=Header->SourceSignalNum;i++)
{
fread(&Tabel[i].SourceSignal_CodeLength,sizeof(unsigned char),1,fp);
fread(&Tabel[i].CodeBits,sizeof(unsigned short int),1,fp);
printf("Number=%4d,SourceSignal=%4d,CodeLength=%4d,CodeBits=",i,Tabel[i].SourceSignal_CodeLength>>4,Tabel[i].SourceSignal_CodeLength&017);
for(int j=1;j<=(Tabel[i].SourceSignal_CodeLength&017);j++)
{
temp=Tabel[i].CodeBits&(1<<(16-j));
temp=temp>>(16-j);
printf("%2d",temp);
}
printf("\n");
}
//读原文件文件名
i=Header->FileNameLength;
fread(&filename,i,1,fp);
printf("\nThe filename is ");
for(i=0;i<Header->FileNameLength;i++)
{
printf("%c",filename[i]);
DepressFileName[i]=filename[i];
}
DepressFileName[i]='\0';
//printf("\n\nThe huffman code is:\n\n");
i=0;
while(!feof(fp))
{ch=fgetc(fp);
i++;
Huffmancode[i]=ch;
//printf("codenumber=%4d ch=%4d, ",i,ch);
//if((i%3)==0)printf("\n");
}
i--;
Huffmancode[0]=i;
fclose(fp);
}
/* 解码*/
int DecodeHuffmanCode(unsigned char OriginalCode[],unsigned char Huffmancode[],HUFFMANFILEHEADER *Header,TABEL Tabel,char DepressFileName[])
{ int HuffmancodeNum;
unsigned char tempcode=0;
unsigned char tempHuffmancode=0;
unsigned char count=0;
unsigned char bitcount=0;
BYTE CodeLength=0;
int OriginNum=0;
for(int i=1;i<=Header->SourceSignalNum;i++)
{ CodeLength=Tabel[i].SourceSignal_CodeLength&15;
Tabel[i].CodeBits=Tabel[i].CodeBits>>(16-CodeLength);
//printf("CodeLength=%d Tabel[%2d].CodeBits=%4o\n",CodeLength,i,Tabel[i].CodeBits);
}
// printf("%4d\n",Huffmancode[HuffmancodeNum]);
HuffmancodeNum=Header->hfSize-Header->FileNameLength-Header->hfOffBits;
//printf("\nHuffmancodeNum=%d\n",HuffmancodeNum);
for(i=1;i<=HuffmancodeNum-1;)
{
++count;
tempHuffmancode=Huffmancode[i]&(1<<(8-count));
tempHuffmancode=tempHuffmancode>>(8-count);
tempcode=(tempcode<<1)+tempHuffmancode;
bitcount++;
for(int j=1;j<=Header->SourceSignalNum;j++)
{
if( bitcount==(Tabel[j].SourceSignal_CodeLength&15))
{
if( tempcode==Tabel[j].CodeBits )
{
tempcode=0;
OriginNum++;
bitcount=0;
OriginalCode[OriginNum]=(Tabel[j].SourceSignal_CodeLength>>4);
//printf("\ncodednumber=%4d code=%4d",OriginNum,OriginalCode[OriginNum]);
}
}
}
if(count==8)
{
count=0;
i++;
}
}
//printf("\ntempcode=%4d,i=%4d\n",tempcode,i);
//尾部处理方法
bitcount=0;
for(i=1;i<=Header->ValidDataBitsNum;i++)
{
tempHuffmancode=Huffmancode[HuffmancodeNum]&(1<<(8-i));
tempHuffmancode=tempHuffmancode>>(8-i);
tempcode=(tempcode<<1)+tempHuffmancode;
bitcount++;
for(int j=1;j<=Header->SourceSignalNum;j++)
{
if( bitcount==(Tabel[j].SourceSignal_CodeLength&15))
{
if( tempcode==Tabel[j].CodeBits )
{
tempcode=0;
OriginNum++;
OriginalCode[OriginNum]=(Tabel[j].SourceSignal_CodeLength>>4);
bitcount=0;
//printf("\ncodednumber=%4d code=%4d",OriginNum,OriginalCode[OriginNum]);
}
}
}
}
FILE *fp;
fp=fopen(DepressFileName,"wb");
//printf("\nThe origin code is:\n\n");
OriginNum=OriginNum/2;
printf("\nThe OriginNum is :%4d",OriginNum);
for(i=1;i<=OriginNum;i++)
{
OriginalCode[i]=(OriginalCode[2*i-1]<<4)+OriginalCode[2*i];
//printf("OriginNUM=%4d code=%4d ",i,OriginalCode[i]);
//if((i%3)==0)printf("\n");
fputc(OriginalCode[i],fp);
}
printf("\n");
fclose(fp);
return OriginNum;
}
void main()
{ HUFFMANFILEHEADER *Header;
Header=(HUFFMANFILEHEADER *)malloc(sizeof(HUFFMANFILEHEADER));
TABEL Tabel;
char DepressFileName[20];
unsigned char Huffmancode[MAXNUMBER];
unsigned char OriginalCode[MAXNUMBER*2];
int OriginNum=0;
readfile(Header,Huffmancode,Tabel,DepressFileName);
OriginNum=DecodeHuffmanCode(OriginalCode,Huffmancode,Header,Tabel,DepressFileName);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -