⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.cpp

📁 一个类似于压缩软件的程序
💻 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 + -