這是對之前的哈夫曼編碼–壓縮與解壓的乙個補充說明,這裡只做簡單的原理介紹,不做過多的具體實現。
由於不同的檔案壓縮所用編碼不同,必須將對應的編碼寫入到壓縮檔案中,才能在解壓時還原。
標頭檔案不同,所得的檔案解壓方式不同,大小也會有所不同,甚至會變大。
定義壓縮後的檔案格式如下圖所示,其中藍綠色塊為標頭檔案,其他資訊主要存放原檔案資訊或者編碼輔助資訊,編碼單元存放字元編碼後資訊,灰色部分為原檔案壓縮後內容,可見頭檔案大小取決於編碼的儲存方式。
為了更好的描述,這裡提前做如下定義:
直接將字元和編碼直接寫入壓縮檔案中。在解壓時,獲得標頭檔案資訊,每讀取乙個字元,將字元按2進製轉化為01字元,再與標頭檔案中的所有的code 進行比較,找到對應的alpha寫入解壓檔案中。
將01編碼按照每8位壓縮為乙個字元,有效地減小標頭檔案的大小。壓縮之後的標頭檔案如下:
由於用了最長的編碼長度,b中方法仍有很多冗餘資訊。直接按照不同編碼的編碼長度做最優的長度壓縮,如:一段標頭檔案中編碼最短為3,最長為36,如果按照b中方法需要將3補全為40再壓縮為5個字元,但是這裡我們只需要將3補全為8個,壓縮為1個字元即可。
其他資訊:
因為壓縮上需要讀取每乙個編碼的長度,編碼補全,編碼壓縮,壓縮後字元個數統計,在解壓上需要根據編碼資訊全長來擷取整個標頭檔案,再按照codelen,壓縮字元長度和壓縮字元來對編碼資訊進行恢復。原文解壓同a。
之前的方法這麼說標頭檔案都比較大,而且有的在實現上還很麻煩。這裡將給出另一種更簡便高效的壓縮方式,這也是哈夫曼編碼–壓縮與解壓中採用的方法。
頻數的位置對應ascii碼,如第0個頻數表示ascii碼為0字元的頻數。讀取這些頻數,可以有效地恢復哈夫曼樹,以達到對壓縮檔案的解壓。如果頻數用unsigned long格式的資料,就可以記錄很大的資料,標頭檔案僅占有2k。
d中方法更加適合於字元種類較多檔案,對於字元種類較少的檔案,如77種字元,卻要用256個位置來記錄,明顯浪費了很多空間。如果我們用0表示有1表示無,用256個0或1可以表示字元有無,256個0或1又可壓縮為16個字元,即8個unsigned long資料,便可省下一些空間。
無論如何標頭檔案終究還是很小的,而且按照現在的硬體儲存能力,標頭檔案的大小不會占有太大的儲存空間。
檔案壓縮(哈夫曼壓縮)
檔案壓縮總結 哈夫曼壓縮 在學習哈弗曼壓縮之前,還是首先來了解什麼是哈夫曼樹,哈夫曼編碼。1.哈夫曼樹是一種最優二叉樹,它的帶權路徑長度達到最小。樹的帶權路徑長度為所有葉子結點帶權路徑長度之和。而結點的帶權路徑長度是結點的路徑長度乘以結點的權值。2.哈夫曼編碼是依據字元出現概率來構造異字頭的平均長度...
利用哈夫曼編碼壓縮檔案
編譯環境 ubuntu 16.04 本文主要考核如何以c實現積體電路測試向量檔案的無失真壓縮。在通常的檔案儲存中,無論是二進位制格式的檔案還是文字檔案,幾乎都是等寬的編碼。比如ascii碼格式的文字檔案,每個字元由乙個ascii碼表示,寬度為8bit。然而,從磁碟空間利用率的角度看,這並不是一種效率...
哈夫曼樹壓縮 解壓縮檔案
tips 注意二進位制讀寫檔案回車為 r n 詳細分析改天再填坑。還有單純形演算法 github include include include include include include include using namespace std template struct huffnode ...