[問題] Bit Byte 在霍夫曼編碼(Huffman)的操作

作者: Cosmology (宇宙學型男)   2015-05-22 11:40:01
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
OSX + XCode
Linux +Vim
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
應該就C++中的STL吧
問題(Question):
各位版上的高手大家好 小弟只是並沒有受過專業coding訓練
充其量只是個script kiddie
讀了別人的code以後在內化成自己的code
但是在自己重製的過程中遇到很多概念的問題 所以不要鞭太大力
程式碼:
http://codepad.org/n9r2L1vQ
我現在在完成一個霍夫曼編碼的程式
因為這個霍夫曼要能夠讀任何檔案
所以我猜應該是先把檔案讀成Binary檔以後存進f[256]這個陣列裡面
(應該是ASCII字符組成這個檔案吧?)
然後再把每個字符出現的頻率找出來 這是第一步
接著要做的應該是把這些字符出現的頻率一起寫進output的檔案
這樣在還原壓縮檔的時候才可以重建霍夫曼樹吧?
這邊我就開始不太懂了 程式碼內有四行:
fout.put(static_cast<unsigned char>(f[i]>>24));
fout.put(static_cast<unsigned char>((f[i]>>16)%256));
fout.put(static_cast<unsigned char>((f[i]>>8)%256));
fout.put(static_cast<unsigned char>(f[i]%256));
這邊這四行的意思是不是指把出現頻率這個數字轉換成16進位這件事情?
因為現在我疑惑的地方是
例如我出現的f[0] = 7920 但是實際轉換在16進位是1ef0 寫進檔案時卻要是0000 1ef0
為什麼要多這些0000?
ex:
code: f[0] f[1] f[2] f[3]
16進位: 7920 4550 4808 3992
File: 0000 1ef0 0000 11c6 0000 12c8 0000 0f98
因為現在這個程式確實可以運作的 但是我想了解0000這個用意是什麼?
因為我查到板上有人也有做霍夫曼 但是他的檔案壓縮完卻會變大
我查到他後來用write有解決這個問題
但是我有試著用write寫過一次
出來的結果卻是
f01e 0000 c611 0000 c812 0000 980f 0000
感覺像是顛倒 又不像是 還原結果也不對
想請教前輩這些到底有什麼含意? 有什麼不同? 我該往哪方向去找資料?
是不是程式碼內的huf_read and huf_write都是在做這一系列類似的操作?
謝謝
因為資料大部分都是從網路跟書本找的
所以有點零碎 希望把一些概念釐清 希望高手指點我該往哪方面在找資料 謝謝
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版)
補充說明(Supplement):
作者: hpeter (hpeter)   2015-05-22 12:05:00
endian ?? 猜的XD
作者: Touble (不做死就不會死)   2015-05-22 16:57:00
看起來像因為你的array 只有256個但是你的檔案可以讀"任何" binary檔案所以他把本來可能是32bit的資料切成4個8bit的資料才可以保證放進f[256]以計算次數供編碼使用
作者: kingofsdtw (不能閒下來!!)   2015-05-22 19:51:00
F[]型態是32bit
作者: Feis (永遠睡不著 @@)   2015-05-22 20:17:00
先想想加 0000 有甚麼錯? 不加的話你要怎麼讀?原則上你有辦法把寫出去的東西讀回來就可以了至於為什麼不一次寫跟讀一個 int, 這故事就比較長

Links booklink

Contact Us: admin [ a t ] ucptt.com