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

看板C_and_CPP作者 (宇宙學型男)時間9年前 (2015/05/22 11:40), 編輯推噓2(207)
留言9則, 4人參與, 最新討論串1/1
開發平台(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): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.125.175 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1432266004.A.522.html

05/22 12:05, , 1F
endian ?? 猜的XD
05/22 12:05, 1F

05/22 16:57, , 2F
看起來像因為你的array 只有256個
05/22 16:57, 2F

05/22 16:57, , 3F
但是你的檔案可以讀"任何" binary檔案
05/22 16:57, 3F

05/22 16:58, , 4F
所以他把本來可能是32bit的資料切成4個8bit的資料
05/22 16:58, 4F

05/22 16:59, , 5F
才可以保證放進f[256]以計算次數供編碼使用
05/22 16:59, 5F

05/22 19:51, , 6F
F[]型態是32bit
05/22 19:51, 6F

05/22 20:17, , 7F
先想想加 0000 有甚麼錯? 不加的話你要怎麼讀?
05/22 20:17, 7F

05/22 20:17, , 8F
原則上你有辦法把寫出去的東西讀回來就可以了
05/22 20:17, 8F

05/22 20:18, , 9F
至於為什麼不一次寫跟讀一個 int, 這故事就比較長
05/22 20:18, 9F
文章代碼(AID): #1LNgKKKY (C_and_CPP)