//文件解压 ????
#include "HuffmanTree.h"
#define NAMESIZE 500
void NextByte(int a,char*b)
{
for(int i=0;i<8;i++)
if(a){b[7-i]=48+a%2;a=a/2;}
else b[7-i]='0';
b[8]='#';
}
void NextByte_2(int a,char*c)
{
char b[8];int i=0;
for( i=0;i<8;i++)
if(a){b[7-i]=48+a%2;a=a/2;}else break;
for(int k=0;k<i;k++)
c[k]=b[8-i+k];
// for(;i<7;i++)aa[8*j-8+i]='0';
c[i]='#';c[i+1]='#';
}
Status ReWrite(HuffmanTree &T,FILE*pr,int n,char*rezipname)
{
//
char c[9],*s;HuffmanTree p=T+2*n-1;int a=fgetc(pr),w=0;//w为写入文件的数
if(!feof(pr))NextByte(a,c);
else NextByte_2(a,c);
s=c;
FILE*pw=fopen(rezipname,"wb");
while(!feof(pr)){
if(*s=='0'&&p->lchild)p=T+p->lchild;
else if(*s=='1'&&p->rchild)p=T+p->rchild;
if(!p->lchild&&!p->rchild){
if(*s=='0'){w=(T+p->parent)->lchild-1;fwrite(&w,1,1,pw);}
else {w=(T+p->parent)->rchild-1;fwrite(&w,1,1,pw);}
p=T+2*n-1;
}
s++;
if(*s=='#'){
a=fgetc(pr);
if(!feof(pr))NextByte(a,c);
else NextByte_2(a,c);
s=c;
}
}
fclose(pw);
return OK;
}
void rezip(const char*s)
{
//s 为压缩文件的地址和文件名。
if(!s){system("pause");exit(1); }
printf("进行文件解压\n");
FILE*pr,*pw; char sname[NAMESIZE];
int a,i=0,j,n=256,m=2*n-1;UInt32 w[256];
HuffmanCode HC,hc;HuffmanTree HT;
char rezipname[NAMESIZE]="re";
i=0;
while(s[i]!='.')i++;i--;
j=0;
while(s[i]!=92&&i>=0)sname[j++]=s[i--];
i=0;
while(--j>=0){rezipname[2+i]=sname[j];i++;}
rezipname[2+i]='.';i++;
pr=fopen(s,"rb");
if(!pr){
printf("无法打开解压文件\n");exit(1);
}
j=0;a=fgetc(pr);
while(j<4){
rezipname[2+i]=a;if(j<3)a=fgetc(pr);j++;i++;
}
HT=(HuffmanTree)malloc(sizeof(HTNode)*(m+1));
HT[0].weight=0;HT[0].parent=0;HT[0].lchild=0;HT[0].rchild=0;
for(i=1;i<=n;i++){
HT[i].weight=0;//此时不需要权重,所以可以随便赋值。
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=n+1;i<=m;i++)
{
HT[i].weight=0;//此时不需要权重,所以可以随便赋值。
fread(&a,2,1,pr);HT[i].lchild=a;HT[a].parent=i;
fread(&a,2,1,pr);HT[i].rchild=a;HT[a].parent=i;
}
HT[m].parent=0;
//此时HT为霍夫曼树,
ReWrite(HT,pr,n,rezipname);
fclose(pr);
printf("解压成功!\n");
}
int main(int argc,char *argv[])
{
const char*str2;str2=argv[1];
if(argc>0)rezip(str2);
return 0;
}