Huffman 編碼壓縮解壓

2022-05-18 23:26:22 字數 2767 閱讀 2005

說明

某技校資料結構課作業

目前的演算法只對有規律的檔案有效。

此處的規律指的是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...