日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

采用Huffman编码进行数据压缩

發布時間:2025/6/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 采用Huffman编码进行数据压缩 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 問題
    • 實驗環境
    • 程序組成
    • 實現思路
    • 如何用二進制0/1表示字符 '0' / '1'
    • 源代碼下載
    • 程序運行和結果:
    • 總結

問題

??????利用哈夫曼編碼將英文文獻進行壓縮
注:哈夫曼算法及原理見博客https://blog.csdn.net/Little_ant_/article/details/104246904在此不再贅述。

實驗環境

??????VS2017 C++

程序組成

??????main.cpp 文件里調用具體的函數實現整體上的功能。
??????Huffm.h 文件中實現huffman算法的編碼,以及譯碼到指定文件的功能。
??????Input.h 文件中統計文本信息,然后作為huffman算法的輸入。
??????Output.h 文件中將目標文件通過huffman編碼進行壓縮。
??????hello.txt 文件為需要被壓縮的文件,即目標文件 。
??????helloCompressed.txt 文件是被壓縮之后得到的文件。
??????HelloUnziped.tx 文件是解壓縮之后得到的文件。

實現思路

??????1, 先熟悉huffman算法的邏輯,并進行實現。(以前比較熟)
??????2, 構造huffman算法的輸入,即統計文本信息,建立huffman樹并完成huffman編碼。
??????3, 通過huffman編碼來將hello.txt中的字符轉換為對應的編碼,壓縮文件為helloCompressed.txt
??????4, 通過譯碼算法來解壓我們壓縮過的文件,得到文件helloUnzipedtxt,并與目標文件hello.txt相對比。
??????具體的編碼方式:對文本中每一個出現的字符進行頻度統計,進行編碼。

如何用二進制0/1表示字符 ‘0’ / ‘1’

??????通過Huffm.h將源文件進行編碼,所得到的信息有,所有的字符數量 (int 型),字符種類數(int 型),huffman樹(struct*)和huffman編碼(char**)。假設對字符’a’所得到的huffman編碼字符串為char* str=”0101” ,如何轉化為二進制序列 0101?從而實現壓縮文件的功能。


??????這里通過c語言中的位操作符,左移和右移來定位到每一個bit上,從而對bit進行賦值,或讀取每一個bit。代碼如下: unsigned char ch1 = fgetc(streamin);//讀源文件內容,逐字節來讀取char value = 0;int pos = 0;int resIndex;int codeLen;while (ch1 != EOF){if (feof(streamin))break;resIndex = getHuffmanCode_index(data, ch1);if (resIndex == -1)return;char* code = hc[resIndex];//每個字符的Huffman編碼codeLen = strlen(code);for (int i = 0; i < codeLen; i++)//一個一個比特位來進行放{value <<= 1;//先左移一位,如果code為1就進行下面的代碼,把第一位變為1,為0就不處理//循環進行,就會把哪一位為1就把那一位置為1if (code[i] == '1')//得到二進制的1{value |= 1;//把原來為0的位置變為1,即就是寫進1.}if (++pos == 8)//滿8位寫入文件{fputc(value, streamout);//把value寫進去,里面存的8個位就是HuffmanCodevalue = 0;//重置,循環寫pos = 0;}}ch1 = fgetc(streamin);}

??????ch1為源文件中讀入的字符,code為該字符對應的huffman編碼。value在此起到一個緩沖區的作用,一直在不停的左移,它是用來將字符 ‘1’ 轉換為二進制 1的重點。假設編碼序列為”0101111”,將其轉換為二進制存儲的過程如下:
??????初始:value 00000000
??????左移一位:value 00000000
??????判斷序列的第一位,發現其為0,那就左移一位:value的值為00000000
??????判斷序列的第二位,發現其為1,那就將上一步的value與00000001進行或操作,得到value值為:00000001 然后左移一位:00000010
??????判斷序列的第三位,發現其為0,那就左移一位:value的值為00000100
??????判斷序列的第四位,發現其為1,那就將上一步的value與00000001進行或操作,得到value值為:00000101 然后左移一位:00001010
??????判斷序列的第五位,發現其為1,那就將上一步的value與00000001進行或操作,得到value值為:00001011 然后左移一位:00010110
??????判斷序列的第六位,發現其為1,那就將上一步的value與00000001進行或操作,得到value值為:00010111 然后左移一位:00101110
??????判斷序列的第七位,發現其為1,那就將上一步的value與00000001進行或操作,得到value值為:00101111 然后左移一位:01011110

??????從而我們將字符串”0101111”轉換為二進制bit存儲在字節value變量中,此時的value變量值為 01011110 ,前面7位是字符串,現在在等待下一字符串序列。
??????采用pos變量來記錄左移的次數,如果左移8次,那就表示value的8個位已經存滿了,就要將value輸出到壓縮文件helloCompressed.txt里面。清零pos,讓value一直循環左移,直到將目標文件hello.txt中的字符全部讀取。

??????解壓縮過程同理。

源代碼下載

https://download.csdn.net/download/Little_ant_/15452531 注:不需要積分哦

程序運行和結果:

??????將所有文件放在同一個執行目錄下,如下:

??????運行程序之后結果為:

??????運行結果如下:

總結

??????壓縮后文件helloCompressed.txt大小為4kB,而目標文件hello.txt的大小為7kB。并且解壓之后文件helloUnziped.txt與目標文件一模一樣。
??????壓縮率為近50%。

總結

以上是生活随笔為你收集整理的采用Huffman编码进行数据压缩的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。