說明
某技校資料結構課作業
目前的演算法只對有規律的檔案有效。
此處的規律指的是0x00到0xff的分布不均勻以下內容毫無邏輯,不具有參考價值。txt檔案不論漢字還是英文有效。jpg,pdf壓縮無效。
參考資料
思路建立
1. 讀寫二進位制檔案
file *fi=fopen("origin.data","rb");
file *fo=fopen("zip.data","wb");
unsigned char c;
fread(&c,sizeof(unsigned char),1,fi);
fwrite(&c,sizeof(unsigned char),1,fo);
fclose(fi);
fclose(fo);
其他的檔案操作,比如rewind,以及對陣列、結構體讀寫略。
2. 權重
int *weight[256]=;
c : file
weight[c]++
僅對權重不為0的編碼
3. 編碼後
char *huffmancode[256];256 //malloc分配各自的空間,每個編碼的結尾為'\0'
huffmancode[c] //c是 8 bits 可進行位操作
當前所得,密碼本
huffmancode[c]="11110" //位數不定,結尾是'\0'
分析
乙個無符號數(0~255),本身是
數 123
位 7b 01111011
字元 '
// if(feof(fp))
// weight[c]--;
fclose(fp);
}typedef structhtnode;
unsigned char **huffmancode;//code
htnode *root; //tree
//int *weight;
void selectmin2(int count,int total,int *s1,int *s2) //select 2 min weight , parent=0, weight !=0
else
huffmancode[i-1]=(unsigned char*)malloc((256-start)*sizeof(unsigned char));
strcpy(huffmancode[i-1],&temp[start]);}}
free(temp);
return total;
}void compress()
; fread(&c,1,1,fi);
unsigned char work[256]=;
unsigned char copy[256]=;
unsigned char write=0;
while(!feof(fi))
fread(&c,1,1,fi);
}if(strlen(work))
fclose(fi);
fclose(fo);
int i;
for(i=0;i<256;i++)
printf("%x %d %s\n",i,weight[i],huffmancode[i]);
for(i=0;i<256;i++)
free(huffmancode);
free(weight);
free(root);
}void uncompress()
unsigned char store[256]=;
unsigned char work[9]=;
unsigned char copy[256]=;
work[8]='\0';
unsigned char c1,c2;
fread(&c1,1,1,fi);
fread(&c2,1,1,fi);
while(!feof(fi))
strcat(store,work);
while(strlen(store)>=maxcode)
unsigned char write=cur-1;
fwrite(&write,1,1,fo);
strcpy(copy,&store[k]);
strcpy(store,copy);
}c1=c2;
fread(&c2,1,1,fi);
}work[8-zero]='\0';
int j;
for(j=0;j<=7-zero;j++,c1<<=1)
strcat(store,work);
while(strlen(store))
unsigned char write=cur-1;
fwrite(&write,1,1,fo);
strcpy(copy,&store[k]);
strcpy(store,copy);
}for(i=0;i<256;i++)
free(huffmancode);
free(weight);
free(root);
fclose(fi);
fclose(fo);
}int main()
其他
zip壓縮演算法詳細分析及解壓例項解釋
Huffman編碼壓縮演算法之壓縮與解壓篇
今天的課程設計終於查完了,做了將近一周的huffman也暫時告一段落了。其間用到了壓縮,又開拓了眼界,又認識了乙個標頭檔案,那我們接下來就小結一下用到的壓縮方法。壓縮 while str.size 8 我們壓縮的時候肯定不會這麼巧剛好是8位的,我們就需要處理一下,判斷最後剩下的str.size 的大...
huffman編碼實現資料壓縮
huffman編碼壓縮 huffman編碼壓縮的 如下 主方法 public static void main string args 2.統計內容的字元數量,構建list為哈夫曼樹做準備 將統計字元個數的方法封裝 public static list countcharnum byte bytes...
C Huffman編碼壓縮解壓
壓縮 統計詞頻 建立huffman樹 儲存詞頻 逐個位元組轉換為編碼寫入 解壓 讀取詞頻 建立huffman樹 讀取編碼重走huffman樹返回對應字元 include include include include include include include define ok 1 using...