/*用于在解压的时候将读取到的ASCII码转换为二进制数*/
int swap(int data)
{
int i = 0;
while(data)
{
num[i++] = data%2;
data = data/2;
}
return i;
}
/*进行文件的解压*/
void uncompress_file(char* file1,char* file2)
{
FILE *fo = fopen(file1,"rb");
FILE *fw = fopen(file2,"wb");
if(fo==NULL ||fw == NULL)
{
printf("文件打开失败!");
return;
}
char str[1000];
int i,j,k,temp = 0;
int index;
int sum_bit2 = sum_bit;
//直到读取到文件结尾
while(!feof(fo))
{
if(sum_bit2<0) break;
//读取一次,减去8位
sum_bit2 -=8;
int data = fgetc(fo);
if(data == -1) break;
//index用来在sum_bit2小于0的时候设置读取为位数(也就是说最后不用读取8位了)
if(sum_bit2<0)
{
index = 0-sum_bit2;
}
else
{
index = 0;
}
if(data == -1) break;
memset(num,0,sizeof(num));
//将读取到的data转换成二进制数
swap(data);
i = temp;
//将转换后的二进制数变为字符串,注意顺序
//是一位一位的往里面填,填进去一位立即进行比较,当找到相应的信息就调出来
for(k=7;k>=index;i++,k--)
{
if(num[k])
str[i] = '1';
else
str[i] = '0';
str[i+1] ='\0';
//查找编码表当中与该字符串(编码)相同的信息,然后将叶子信息写入解压文件
for(j=1;j<=count;j++)
{
if(strcmp(str,HC[j])==0)
{
//将叶子信息写入到文件(写入的是int值,是该int值表示的字符)
fputc(code[j],fw);
if((sum_bit-sum_bit2)%1500==0)
{
printf("\r文件正在解压中,请耐心等待……%6.2f%%",(double)(sum_bit-sum_bit2)/sum_bit*100.0);
}
fflush(fw);
j = count+1;
i = -1;
}
}
}
if(i)
{
temp = i;
}
else
{
temp = 0;
}
}
sum_bit2 = 0;
printf("\r文件正在解压中,请耐心等待……%6.2f%%",(double)(sum_bit-sum_bit2)/sum_bit*100.0);
printf("解压成功!");
fclose(fw);
fclose(fo);
}