看板 C_and_CPP 關於我們 聯絡資訊
小弟最近在寫霍夫曼壓縮 照他的說明: "假設想要壓縮下面這段資料:ACDABA 因為它有 6 個英文字元,所以這串文字占用 6 個位元組 (Bytes) 或 48 各位元 (Bits) 壓縮後的資料變成:01101110100 (經過霍夫曼樹後) 這表示只用了 11 個位元就可以取代了 48 個位元 => 達成壓縮目的" 我是讀進txt檔案 經過運算後輸出txt檔案 可是看了看文件內容... 原本:6個位元組(ACDABA型態) 輸出後:11個位元組(01101110100) 崩潰... 怎越壓越大QQ 是說霍夫曼CODE不適用於txt檔案嗎(已經是純文字)?? 還是我的輸出格式有問題 ~(我是用fout輸出,每個字的霍夫曼編碼存在不同char陣列裡面) 有點想不通 想請教各位高手~~ 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.66.184
strangehead:要存成二進位數值,存對的話開出來會是亂碼 06/04 04:11
kiedveian:因為1位元的資料以1位元組儲存 06/04 08:02
BSpowerx:你要自己把八個01轉成1位元組啊 06/04 08:04
TaiwanXDman:要用二進位啊老兄 06/04 08:42
wzbird:純練習的話倒是也可以算寫對了 06/04 11:30
喔喔!! 不知道我這樣理解對不對? 原文: ABCDEFG.... 轉碼後: 01101010111000... *轉2進位: (01101010)(10110001)(110.... || || 一位元 一位元 => 達到壓縮目的@@??? ※ 編輯: gn123 來自: 140.113.66.184 (06/04 11:42)
TaiwanXDman:YES 06/04 12:07
TaiwanXDman:應該說每個1跟0都是一位元 你原本作法是 06/04 12:08
TaiwanXDman:每個1跟0都變字元來存 那一個1就是8位元了 06/04 12:08
gn123:了解!! 謝謝樓上解說>< 06/04 12:58
diabloevagto:你要印出來應該要轉成ascii code在秀出來 06/04 13:03
diabloevagto:用特殊的軟體打開txt檔,選用2進制顯示 06/04 13:04
我現在雖然懂了如何變小,可是不知道怎把我編碼轉成1位元的2進位編碼QQ 比方說,下列是文章單字經過Huffman Tree轉換的編碼: A: 0000 B: 0101010101 C: 110000 D: 101111000 ... 這些編碼我存在char [] 裡面 可是剛剛查了一堆資料越搞越混,不知道怎樣才叫做"轉成1位元"??? 請教版上高手~謝謝 ※ 編輯: gn123 來自: 140.113.66.184 (06/04 13:20)
uranusjr:我想你應該要先搞清楚字元編碼是什麼 06/04 13:41
uranusjr:算了直接解釋好了 06/04 13:41
diabloevagto:你知道bit跟byte的差別嗎? 06/04 13:51
gn123:1byte=8bit@@" 06/04 13:52
james732:要知道寫成程式的差別XD 06/04 13:53
diabloevagto:那你輸出一個字元1,就代表1byte 06/04 13:59
diabloevagto:huffman壓縮的意思就是不用1byte代表一個字 06/04 14:00
diabloevagto:常出現短的編碼代表他,這是huffman的精神 06/04 14:00
diabloevagto:他的1是1bit,但你輸出用了1byte當然會變大 06/04 14:00
diabloevagto:你要寫出檔案要用2進制模式,然後用bit寫出 06/04 14:01
diabloevagto:當然開檔也要用2進制模式顯示 06/04 14:01
diabloevagto:如果不懂,你在去看看huffman為什麼可以壓縮 06/04 14:02
diabloevagto:搞懂他的精神所在吧 06/04 14:03
gn123:好的@@ 我再想一想 謝謝樓上熱心指導 06/04 14:08
drag:atoi() 06/04 17:52
drag:sorry沒atoi()這麼簡單,當我沒說好了~:P 06/04 17:58