while(header[f].parent!=-1){
j=f;
f=header[f].parent;
if(header[f].lch==j){
//置左分支编码 0
j=strlen(header[i].bits);
memmove(header[i].bits+1,header[i].bits,j+1);
//依次存储连接"0""1"编码,此处语句为网络借鉴
header[i].bits[0]='0';
}
else{
//置右分支编码 1
j=strlen(header[i].bits);
memmove(header[i].bits+1,header[i].bits,j+1);
header[i].bits[0]='1';
}
}
}
fseek(ifp,0,SEEK_SET);
//从文件开始位置向前移动 0 字节,即
定位到文件开始位置
fwrite(&flength,sizeof(int),1,ofp);
/*用来将数据写入文件流
中,参数 flength
指向欲写入的数据地址,总共写入的字符数
以参数 size*int 来决定,返回实际写入的 int 数目*/
fseek(ofp,8,SEEK_SET);
buf[0]=0;
//定义缓冲区,它的二进制表示 00000000
f=0;
pt1=8;
/* 假 设 原 文 件 第 一 个 字 符 是 "A" , 8 位 2 进 制 为
01000001,
位并没有
下
如果
编码后为 0110 识别编码第一个'0',那么将其左移一位,
看起来没什么变化。下一个是'1',应该|1,结果 00000001
同理 4 位都做完,应该是 00000110,由于字节中的 8
全部用完,继续读下一个字符,根据编码表继续拼完剩
4 位,如果字符的编码不足 4 位,还要继续读一个字符,
字符编码超过 4 位,那么把剩下的位信息拼接到一个新
的字节里*/
while(!feof(ifp)){
c=fgetc(ifp);
f++;
for(i=0;i
}
strcat(buf,header[i].bits);
j=strlen(buf);
c=0;
while(j>=8){
for(i=0;i<8;i++){
if(buf[i]=='1')
c=(c<<1)|1;
//添加最后一位为 1
else
c=c<<1;
//添加最后一位为 0
}
fwrite(&c,1,1,ofp);
pt1++;
strcpy(buf,buf+8);
j=strlen(buf);
}
if(f==flength)
break;
}
if(j>0){
//最后不满八位的 buf 处理
strcat(buf,"00000000");
//buf 后加八位 0
for(i=0;i<8;i++){
//逐位输入八位前的二进制符