该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
编码:
#include
void main(int argc,char **args)
{
FILE *fin,*fout;
short left[511],right[511];
unsigned char c;
long len;
int parent[511],value[511],lr[511];
char code[256][256];
for(long i=0;i<511;i++)
{
parent[i]=-1;
value[i]=0;
lr[i]=-1;
left[i]=-1;
right[i]=-1;
}
for(i=0;i<256;i++)
for(int j=0;j<256;j++)
code[i][j]='\0';
fin=fopen(args[1],"rb");
fout=fopen(args[2],"wb");
fseek(fin,0,SEEK_END);
len=ftell(fin);
rewind(fin);
for(i=0;i
{
c=fgetc(fin);
value[c]++;
}
for(i=256;i<511;i++)
{
int m1,m2;
for(m1=0;m1
if(parent[m1]==-1)
break;
for(int j=0;j
if(value[m1]>value[j]&&parent[j]==-1)
m1=j;
for(m2=0;m2
if(parent[m2]==-1&&m2!=m1)
break;
for(j=0;j
if(value[m2]>value[j]&&j!=m1&&parent[j]==-1)
m2=j;
parent[m1]=i;
parent[m2]=i;
left[i]=m1;
right[i]=m2;
lr[m1]=0;
lr[m2]=1;
value[i]=value[m1]+value[m2];
}
for(i=0;i<256;i++)
{
int pos=i,j=0;
char tempCode[256];
while(lr[pos]!=-1)
{
if(lr[pos]==0)
tempCode[j]='0';
if(lr[pos]==1)
tempCode[j]='1';
j++;
pos=parent[pos];
}
tempCode[j]='\0';
for(int k=j-1;k>=0;k--)
code[i][j-1-k] = tempCode[k];
}
fwrite((char*)&len,4,1,fout);
for(i=256;i<511;i++)
{
fwrite((char*)&left[i],2,1,fout);
fwrite((char*)&right[i],2,1,fout);
}
rewind(fin);
char tempByte=0;
int posBit=7;
for(i=0;i
{
c=fgetc(fin);
int j=0;
while(code[c][j]!='\0')
{
if(code[c][j]=='1')
tempByte=tempByte|(1<
posBit--;
if(posBit==-1)
{fputc(tempByte,fout);posBit=7;tempByte=0;}
j++;
}
}
if(posBit!=-1)
fputc(tempByte,fout);
fclose(fout);
fclose(fin);
}
解码:
#include
void main(int argc,char **args)
{
FILE *fin,*fout;
unsigned short pos=510;
long len,l;
unsigned char c;
short left[255],right[255];
fin=fopen(args[1],"rb");
fout=fopen(args[2],"wb");
fseek(fin,0,SEEK_END);
len=ftell(fin)-1024;
rewind(fin);
fread((char*)&l,4,1,fin);
for(long i=0;i<255;i++)
{
fread((char*)&left[i],2,1,fin);
fread((char*)&right[i],2,1,fin);
}
for(i=0;i
{
c=fgetc(fin);
for(int j=7;j>-1;j--)
{
if((c&(1<>j==0) pos=left[pos-256];
if((c&(1<>j==1) pos=right[pos-256];
if(pos<256&&l>0)
{
fputc((char)pos,fout);
l--;
pos=510;
}
}
}
fclose(fin);
fclose(fout);
}