壓縮軟件(哈夫曼算法實(shí)現(xiàn))

上傳人:yo****e 文檔編號(hào):57885972 上傳時(shí)間:2022-02-25 格式:DOC 頁數(shù):14 大?。?70KB
收藏 版權(quán)申訴 舉報(bào) 下載
壓縮軟件(哈夫曼算法實(shí)現(xiàn))_第1頁
第1頁 / 共14頁
壓縮軟件(哈夫曼算法實(shí)現(xiàn))_第2頁
第2頁 / 共14頁
壓縮軟件(哈夫曼算法實(shí)現(xiàn))_第3頁
第3頁 / 共14頁

下載文檔到電腦,查找使用更方便

16 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《壓縮軟件(哈夫曼算法實(shí)現(xiàn))》由會(huì)員分享,可在線閱讀,更多相關(guān)《壓縮軟件(哈夫曼算法實(shí)現(xiàn))(14頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、壓縮軟件(哈夫曼算法實(shí)現(xiàn)) 項(xiàng)目總結(jié) 算法CC++C#DOS   一、在講具體代碼實(shí)現(xiàn)之前,先給大家普及一下壓縮軟件的相關(guān)知識(shí) 引用 壓縮軟件是利用算法將文件有損或無損地處理,以達(dá)到保留最多文件信息,而令文件體積變小的應(yīng)用軟件。壓縮軟件一般同時(shí)具有解壓縮的功能。壓縮軟件的的基本原理是查找文件內(nèi)的重復(fù)字節(jié),并建立一個(gè)相同字節(jié)的"詞典"文件,并用一個(gè)代碼表示,比如在文件里有幾處有一個(gè)相同的詞"中華人民共和國"用一個(gè)代碼表示并寫入"詞典"文件,這樣就可以達(dá)到縮小文件的目的。常見的壓縮軟件有WinRAR ,好壓(Haozip),WinZip,7-Zip,WinMount,Peazip等等。

2、 ??????? 哈夫曼樹作為數(shù)據(jù)結(jié)構(gòu)二叉樹章節(jié)中最為華彩的一部分,有著其獨(dú)特的魅力。給定n個(gè)權(quán)值作為n個(gè)葉子結(jié)點(diǎn),構(gòu)造一棵二叉樹,若帶權(quán)路徑長度達(dá)到最小,這樣的二叉樹便是哈夫曼樹,也稱為最優(yōu)二叉樹。  ??????? 二、哈夫曼算法? 引用 ??????? Huffman算法是一種基于統(tǒng)計(jì)的壓縮方法。它的本質(zhì)就是對文本文件中的字符進(jìn)行重新編碼,對于使用頻率越高的字符,其編碼也越短。但是任何2個(gè)字符的編碼, 是不能出現(xiàn)向前包含的。也就是說字符A(假設(shè)為00)的編碼的前段,不可能為字符B(則B的編碼不可能為001,因?yàn)檫@里B的編碼中包含了A的前段00,這會(huì)給解碼難帶來不必要的困

3、難,所以這是不允許的)的編碼。經(jīng)過編碼后的文本文件,主要包含2個(gè)部分:Huffman碼表部分和壓縮內(nèi)容部分。解壓縮的時(shí)候,先把Huffman碼表取出來,然后對壓縮內(nèi)容部分各個(gè)字符進(jìn)行逐一解碼,形成源文件。 ??????? 哈夫曼編碼生成步驟: ??????? ①掃描要壓縮的文件,對字符出現(xiàn)的頻率進(jìn)行計(jì)算。 ??????? ②把字符按出現(xiàn)的頻率進(jìn)行排序,組成一個(gè)隊(duì)列。 ??????? ③把出現(xiàn)頻率最低(權(quán)值)的兩個(gè)字符作為葉子節(jié)點(diǎn),它們的權(quán)值之和為根節(jié)點(diǎn)組成一棵樹。 ??????? ④把上面葉子節(jié)點(diǎn)的兩個(gè)字符從隊(duì)列中移除,并把它們組成的根節(jié)點(diǎn)加入到隊(duì)列。 ???????

4、⑤把隊(duì)列重新進(jìn)行排序。重復(fù)步驟③④⑤直到隊(duì)列中只有一個(gè)節(jié)點(diǎn)為止。 ??????? ⑥把這棵樹上的根節(jié)點(diǎn)定義為0(可自行定義0或1)左邊為0,右邊為1。這樣就可以得到每個(gè)葉子節(jié)點(diǎn)的哈夫曼編碼了。 ??????? 三、編碼流程(大體思路) ??????? 壓縮: ??????? 1、將要壓縮的文件一個(gè)一個(gè)字節(jié)的讀出來即掃描要壓縮的文件,并統(tǒng)計(jì)每個(gè)字節(jié)的權(quán)值即出現(xiàn)的頻率。 ??????? 2、以每個(gè)字節(jié)的權(quán)值來構(gòu)造哈夫曼樹,并給每個(gè)字節(jié)進(jìn)行哈夫曼編碼。 ??????? 3、將每個(gè)字節(jié)和其對應(yīng)得哈夫曼編碼存放進(jìn)一個(gè)Map中,即碼表。 ??????? 4、以這個(gè)碼表為依照

5、,將文件中的所有字節(jié)一一進(jìn)行編碼(生成10字符串),最后在把所有字節(jié)的編碼依次末尾相加合成一個(gè)10字符串。 ??????? 5、將這個(gè)10字符串重新組合,8個(gè)為一組,若最后一組不足8個(gè)則補(bǔ)0,并記錄補(bǔ)0的個(gè)數(shù),將每一組的10字符串轉(zhuǎn)化為一個(gè)字節(jié), 并將所有的10字符串合成一個(gè)字節(jié)數(shù)組,數(shù)組的最后一個(gè)元素存放補(bǔ)0的個(gè)數(shù)。 ??????? 6、創(chuàng)建一個(gè)壓縮文件,先將碼表的大小寫入文件,再將碼表寫入文件(碼表里還有每個(gè)字節(jié)的哈夫曼編碼長度的信息)。 ??????? 7、最后將之前生成的字節(jié)數(shù)組寫入文件(文件的主要信息)。 ??????? 解壓縮: ??????? 1、將壓縮的

6、文件同樣一個(gè)一個(gè)字節(jié)的讀出來。 ??????? 2、先讀出碼表的大小,再通過碼表的大小讀出碼表,并將碼表的信息存放進(jìn)一個(gè)Map。 ??????? 3、再接著讀出后面的所有字節(jié),并轉(zhuǎn)化成一個(gè)10字符串。 ??????? 4、通過與碼表的匹配,從10字符串的第一個(gè)字符開始讀,若讀到的子字符串與碼表的某個(gè)字節(jié)的的編碼相同,解壓出相應(yīng)的字節(jié),把該字節(jié)保存起來。 并把上面的子字符串從編碼中刪除,重復(fù)上一步驟,直到該項(xiàng)編碼解析完成,最后將此10字符串還原成原來的文件的一個(gè)個(gè)字節(jié)。 ??????? 5、再將這些字節(jié)寫入一個(gè)新的文件,后綴名改成和原來文件一樣,就能打開了。 ????

7、??? 四、核心代碼 1、壓縮文件 Java代碼 ? 1. /** ? 2. ?*?壓縮的文件操作 ? 3. ?*? ? 4. ?*?@author?king ? 5. ?*? ? 6. ?*/?? 7. public?class?CompressFileOption?{ ?? 8. ?? 9. ????/** ? 10. ?????*?讀取文件 ? 11. ?????*? ? 12. ?????*?@param?path ? 13. ?????*????????????:文件路徑 ? 14. ?????*?@return:將文件的內(nèi)容以字節(jié)數(shù)組的樣式返

8、回 ? 15. ?????*/?? 16. ????public?static?byte[]?readFile(String?path)?{ ?? 17. ????????byte[]?dataByte?=?null; ?? 18. ????????try?{ ?? 19. ????????????java.io.FileInputStream?fis?=?new?java.io.FileInputStream(path); ?? 20. ????????????int?size?=?fis.available();//?可讀的字節(jié)數(shù) ?? 21. ????????????dat

9、aByte?=?new?byte[size]; ?? 22. ????????????fis.read(dataByte); ?? 23. ?? 24. ????????}?catch?(Exception?e)?{ ?? 25. ????????????//?TODO?Auto-generated?catch?block ?? 26. ????????????e.printStackTrace(); ?? 27. ????????} ?? 28. ????????return?dataByte; ?? 29. ????} ?? 30. ?? 31. ????/** ?

10、32. ?????*?將碼表的相關(guān)信息寫入文件 ? 33. ?????*? ? 34. ?????*?@param?fileSize ? 35. ?????*????????????:原文件大小 ? 36. ?????*?@param?map ? 37. ?????*????????????:存放碼表的map ? 38. ?????*?@param?listCh ? 39. ?????*????????????:存放關(guān)鍵碼的字符隊(duì)列 ? 40. ?????*?@param?path ? 41. ?????*????????????:文件路徑 ? 42. ?????*?@th

11、rows?Exception ? 43. ?????*/?? 44. ????public?static?void?writeMap(int?fileSize, ?? 45. ????????????java.util.HashMap?map,?List?listBy,?String?path) ?? 46. ????????????throws?Exception?{ ?? 47. ?? 48. ????????java.io.FileOutputStream?fos?=?new?java.io.FileOutputStream(path)

12、; ?? 49. ????????java.io.DataOutputStream?dos?=?new?java.io.DataOutputStream(fos); ?? 50. ?? 51. ????????dos.writeInt(fileSize);//?將原文件大小寫入文件 ?? 52. ????????int?mapSize?=?map.size();//?碼表的大小 ?? 53. ????????dos.writeInt(mapSize);//?//將碼表的大小寫入文件 ?? 54. ????????for?(int?i?=?0;?i?

13、 ?? 55. ????????????fos.write(listBy.get(i));//?將每個(gè)字節(jié)寫入文件 ?? 56. ????????????String?hfmcode_next?=?map.get(listBy.get(i));//?得到每個(gè)字節(jié)對應(yīng)的哈夫曼編碼 ?? 57. ????????????byte?codeSize?=?(byte)?hfmcode_next.length();//?每個(gè)字節(jié)對應(yīng)的哈夫曼編碼大小 ?? 58. ????????????fos.write(codeSize);//?將每個(gè)字節(jié)對應(yīng)的哈夫曼編碼大小寫入文件 ?? 59. ????

14、????????dos.writeChars(hfmcode_next);//?將每個(gè)字符對應(yīng)的哈夫曼編碼寫入文件 ?? 60. ????????} ?? 61. ????????dos.flush(); ?? 62. ????????fos.close(); ?? 63. ????} ?? 64. ?? 65. ????/** ? 66. ?????*?將壓縮好的字節(jié)數(shù)組寫入文件 ? 67. ?????*? ? 68. ?????*?@param?b ? 69. ?????*????????????:壓縮好的字節(jié)數(shù)組 ? 70. ?????*?@param?path ?

15、 71. ?????*????????????:文件路徑 ? 72. ?????*/?? 73. ????public?static?void?writeFile(byte[]?b,?String?path)?{ ?? 74. ?? 75. ????????try?{ ?? 76. ????????????java.io.FileOutputStream?fos?=?new?java.io.FileOutputStream(path, ?? 77. ????????????????????true); ?? 78. ????????????java.io.DataOutputS

16、tream?dos?=?new?java.io.DataOutputStream(fos); ?? 79. ????????????//?寫入字節(jié)數(shù)組的大小 ?? 80. ????????????dos.writeInt(b.length); ?? 81. ????????????fos.write(b); ?? 82. ????????????fos.flush(); ?? 83. ????????????fos.close(); ?? 84. ????????}?catch?(Exception?e)?{ ?? 85. ????????????//?TODO?Auto-gen

17、erated?catch?block ?? 86. ????????????e.printStackTrace(); ?? 87. ????????} ?? 88. ????} ?? 89. ?? 90. ????/** ? 91. ?????*?將10字符串轉(zhuǎn)化為一個(gè)字節(jié) ? 92. ?????*? ? 93. ?????*?@param?str ? 94. ?????*????????????:傳入的字符串 ? 95. ?????*?@return:一個(gè)字節(jié) ? 96. ?????*/?? 97. ????private?byte?CharArrayToByte(S

18、tring?str)?{ ?? 98. ????????char[]?c?=?str.toCharArray();//?將字符串str轉(zhuǎn)化為字符數(shù)組c ?? 99. ????????int?len?=?c.length; ?? 100. ????????byte[]?b?=?new?byte[len]; ?? 101. ????????byte?value?=?0; ?? 102. ????????byte?value_next; ?? 103. ????????for?(int?i?=?0;?i?

19、Byte.parseByte(c[i]?+?""); ?? 105. ????????????//?System.out.println(b[i]); ?? 106. ????????} ?? 107. ????????for?(int?i?=?0;?i?

20、??} ?? 111. ????????return?value; ?? 112. ????} ?? 113. ?? 114. ????/** ? 115. ?????*?將10字符串以8個(gè)為一組轉(zhuǎn)化為一個(gè)字節(jié)數(shù)組 ? 116. ?????*? ? 117. ?????*?@param?str ? 118. ?????*?@return ? 119. ?????*/?? 120. ????private?byte[]?StringToByteArray(String?str)?{ ?? 121. ????????char[]?c?=?str.toCharArray();/

21、/?將字節(jié)串str轉(zhuǎn)化為字符數(shù)組c ?? 122. ????????int?len?=?c.length;//?字符串字符的個(gè)數(shù) ?? 123. ????????int?lenByte; ?? 124. ????????String?s?=?""; ?? 125. ????????char?c_next; ?? 126. ????????byte[]?b; ?? 127. ????????if?(len?%?8?==?0)?{//?如果字符串的長度能被8整除 ?? 128. ????????????lenByte?=?len?/?8?+?1; ?? 129. ?????????

22、???b?=?new?byte[lenByte]; ?? 130. ????????????for?(int?i?=?0;?i?

23、tem.out.println("第"?+?i?+?"個(gè)字符串:"?+?s); ?? 136. ????????????????b[i]?=?CharArrayToByte(s); ?? 137. ????????????????s?=?""; ?? 138. ????????????????System.out.println("第"?+?i?+?"個(gè)字符串轉(zhuǎn)化為字節(jié)后的值:"?+?b[i]); ?? 139. ????????????} ?? 140. ????????????b[lenByte?-?1]?=?0;//?字節(jié)數(shù)組的最后一個(gè)存放補(bǔ)0的個(gè)數(shù) ?? 141. ????

24、????}?else?{//?如果字符串的長度不能被8整除 ?? 142. ?? 143. ????????????lenByte?=?len?/?8?+?2; ?? 144. ????????????b?=?new?byte[lenByte]; ?? 145. ????????????int?remainder?=?len?%?8;//?求出除8的余數(shù) ?? 146. ????????????int?zeroNum?=?8?-?remainder;//?補(bǔ)0的個(gè)數(shù) ?? 147. ????????????System.out.println("補(bǔ)0數(shù):"?+?zeroNum);

25、?? 148. ????????????System.out.println("原字符串:"?+?str); ?? 149. ????????????for?(int?i?=?0;?i?

26、 ????????????System.out.println("補(bǔ)0后的字符串的字符個(gè)數(shù):"?+?c.length); ?? 155. ????????????for?(int?i?=?0;?i?

27、?????} ?? 160. ????????????????System.out.println("第"?+?i?+?"個(gè)字符串:"?+?s); ?? 161. ????????????????b[i]?=?CharArrayToByte(s); ?? 162. ????????????????s?=?""; ?? 163. ????????????????System.out.println("第"?+?i?+?"個(gè)字符串轉(zhuǎn)化為字節(jié)后的值:"?+?b[i]); ?? 164. ????????????} ?? 165. ????????????b[lenByte?-?1]?=?

28、(byte)?zeroNum;//?字節(jié)數(shù)組的最后一個(gè)存放補(bǔ)0的個(gè)數(shù) ?? 166. ????????} ?? 167. ????????return?b; ?? 168. ????} ?? 169. ?? 170. ????/** ? 171. ?????*?壓縮文件 ? 172. ?????*? ? 173. ?????*?@param?path1 ? 174. ?????*????????????:原文件路徑 ? 175. ?????*?@param?path2 ? 176. ?????*????????????:壓縮后的文件路徑 ? 177. ?????*?@t

29、hrows?Exception ? 178. ?????*/?? 179. ????public?void?CompressFile(String?path1,?String?path2)?throws?Exception?{ ?? 180. ????????//?從文件中得到字節(jié)數(shù)組 ?? 181. ????????byte[]?b?=?CompressFileOption.readFile(path1); ?? 182. ????????int?b_size?=?b.length;//?原文件大小 ?? 183. ????????byte[]?b_compress;//?字節(jié)數(shù)

30、組,存放壓縮的字符串 ?? 184. ?? 185. ????????String?hfmcode?=?"";//?文件內(nèi)所有字節(jié)的哈夫曼編碼 ?? 186. ????????String?hfmcode_next;//?文件中每個(gè)字節(jié)的哈夫曼編碼 ?? 187. ????????//?計(jì)算字符串中每個(gè)字節(jié)的權(quán)值,并返回一個(gè)存放字節(jié)和它對應(yīng)權(quán)值的節(jié)點(diǎn)隊(duì)列 ?? 188. ????????List?list?=?calWeight.calweight(b); ?? 189. ????????int?size?=?list.size(); ?? 190. ????

31、????Huffman?hfm?=?new?Huffman(); ?? 191. ????????//?構(gòu)建哈夫曼樹并返回根節(jié)點(diǎn) ?? 192. ????????TreeNode?root?=?hfm.createHuffman(list); ?? 193. ????????//?創(chuàng)建哈夫曼編碼使其與字符一一對應(yīng) ?? 194. ????????hfm.createHfmCode(root,?""); ?? 195. ?? 196. ????????java.util.HashMap?map?=?hfm.getMap();//?得到碼表 ?? 197.

32、 ????????List?listBy?=?hfm.getList();//?得到存放關(guān)鍵碼隊(duì)列 ?? 198. ?? 199. ????????System.out.println("mapsize---->:"?+?map.size()); ?? 200. ????????System.out.println("b---->:"?+?b.length); ?? 201. ????????for?(int?i?=?0;?i?

33、?hfmcode_next?=?map.get(b[i]); ?? 204. ????????????System.out.println("第"+i+"個(gè):?"?+?b[i]?+?"的編碼:"?+?hfmcode_next); ?? 205. ????????????hfmcode?=?hfmcode?+?hfmcode_next;//?將每個(gè)字節(jié)的哈夫曼編碼依次相加為一個(gè)01字符串 ?? 206. ????????} ?? 207. ????????System.out.println("01串大小:"?+?hfmcode.length()); ?? 208. ????????S

34、ystem.out.println("01串:"?+?hfmcode); ?? 209. ????????char[]?ch?=?hfmcode.toCharArray(); ?? 210. ????????System.out.println("01串的大小:"?+?ch.length); ?? 211. ?? 212. ????????b_compress?=?StringToByteArray(hfmcode);//?得到字節(jié)數(shù)組 ?? 213. ????????for?(int?i?=?0;?i?

35、?????????System.out.println("第"?+?i?+?"個(gè)字節(jié)"?+?b_compress[i]); ?? 215. ????????} ?? 216. ????????//?將文件大小和碼表相關(guān)信息寫入文件 ?? 217. ????????writeMap(b_size,?map,?listBy,?path2); ?? 218. ????????//?將字節(jié)數(shù)組寫入文件 ?? 219. ????????writeFile(b_compress,?path2); ?? 220. ????}?? /** * 壓縮的文件操作 * * @author

36、 king * */ public class CompressFileOption { /** * 讀取文件 * * @param path * :文件路徑 * @return:將文件的內(nèi)容以字節(jié)數(shù)組的樣式返回 */ public static byte[] readFile(String path) { byte[] dataByte = null; try { java.io.FileInputStream fis = new java.io.FileInputStream(path)

37、; int size = fis.available();// 可讀的字節(jié)數(shù) dataByte = new byte[size]; fis.read(dataByte); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return dataByte; } /** * 將碼表的相關(guān)信息寫入文件 * * @param fileSize * :原文件大小 *

38、 @param map * :存放碼表的map * @param listCh * :存放關(guān)鍵碼的字符隊(duì)列 * @param path * :文件路徑 * @throws Exception */ public static void writeMap(int fileSize, java.util.HashMap map, List listBy, String path) throws Exception { ja

39、va.io.FileOutputStream fos = new java.io.FileOutputStream(path); java.io.DataOutputStream dos = new java.io.DataOutputStream(fos); dos.writeInt(fileSize);// 將原文件大小寫入文件 int mapSize = map.size();// 碼表的大小 dos.writeInt(mapSize);// //將碼表的大小寫入文件 for (int i = 0; i < mapSize; i++) { fos

40、.write(listBy.get(i));// 將每個(gè)字節(jié)寫入文件 String hfmcode_next = map.get(listBy.get(i));// 得到每個(gè)字節(jié)對應(yīng)的哈夫曼編碼 byte codeSize = (byte) hfmcode_next.length();// 每個(gè)字節(jié)對應(yīng)的哈夫曼編碼大小 fos.write(codeSize);// 將每個(gè)字節(jié)對應(yīng)的哈夫曼編碼大小寫入文件 dos.writeChars(hfmcode_next);// 將每個(gè)字符對應(yīng)的哈夫曼編碼寫入文件 } dos.flush(); fos.cl

41、ose(); } /** * 將壓縮好的字節(jié)數(shù)組寫入文件 * * @param b * :壓縮好的字節(jié)數(shù)組 * @param path * :文件路徑 */ public static void writeFile(byte[] b, String path) { try { java.io.FileOutputStream fos = new java.io.FileOutputStream(path, true); java.io.DataOutpu

42、tStream dos = new java.io.DataOutputStream(fos); // 寫入字節(jié)數(shù)組的大小 dos.writeInt(b.length); fos.write(b); fos.flush(); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 將10字符串轉(zhuǎn)化為一個(gè)字節(jié) * * @param str *

43、 :傳入的字符串 * @return:一個(gè)字節(jié) */ private byte CharArrayToByte(String str) { char[] c = str.toCharArray();// 將字符串str轉(zhuǎn)化為字符數(shù)組c int len = c.length; byte[] b = new byte[len]; byte value = 0; byte value_next; for (int i = 0; i < len; i++) { b[i] = Byte.parseByte(c[i] + ""

44、); // System.out.println(b[i]); } for (int i = 0; i < len; i++) { value_next = (byte) (b[i] * Math.pow(2, len - i - 1));// 冪計(jì)算 value = (byte) (value + value_next); } return value; } /** * 將10字符串以8個(gè)為一組轉(zhuǎn)化為一個(gè)字節(jié)數(shù)組 * * @param str * @return */ private byte[]

45、 StringToByteArray(String str) { char[] c = str.toCharArray();// 將字節(jié)串str轉(zhuǎn)化為字符數(shù)組c int len = c.length;// 字符串字符的個(gè)數(shù) int lenByte; String s = ""; char c_next; byte[] b; if (len % 8 == 0) {// 如果字符串的長度能被8整除 lenByte = len / 8 + 1; b = new byte[lenByte]; for (int i = 0; i < le

46、nByte - 1; i++) { for (int j = i * 8; j < (i + 1) * 8; j++) { c_next = c[j]; s = s + c_next; } System.out.println("第" + i + "個(gè)字符串:" + s); b[i] = CharArrayToByte(s); s = ""; System.out.println("第" + i + "個(gè)字符串轉(zhuǎn)化為字節(jié)后的值:" + b[i]); } b[lenByte - 1] = 0;//

47、 字節(jié)數(shù)組的最后一個(gè)存放補(bǔ)0的個(gè)數(shù) } else {// 如果字符串的長度不能被8整除 lenByte = len / 8 + 2; b = new byte[lenByte]; int remainder = len % 8;// 求出除8的余數(shù) int zeroNum = 8 - remainder;// 補(bǔ)0的個(gè)數(shù) System.out.println("補(bǔ)0數(shù):" + zeroNum); System.out.println("原字符串:" + str); for (int i = 0; i < zeroNum; i++

48、) { str = str + '0';// 在字符串后面補(bǔ)0 } System.out.println("補(bǔ)0后的字符串:" + str); c = str.toCharArray(); System.out.println("補(bǔ)0后的字符串的字符個(gè)數(shù):" + c.length); for (int i = 0; i < lenByte - 1; i++) { for (int j = i * 8; j < (i + 1) * 8; j++) { c_next = c[j]; s = s + c_next;

49、 } System.out.println("第" + i + "個(gè)字符串:" + s); b[i] = CharArrayToByte(s); s = ""; System.out.println("第" + i + "個(gè)字符串轉(zhuǎn)化為字節(jié)后的值:" + b[i]); } b[lenByte - 1] = (byte) zeroNum;// 字節(jié)數(shù)組的最后一個(gè)存放補(bǔ)0的個(gè)數(shù) } return b; } /** * 壓縮文件 * * @param path1 *

50、 :原文件路徑 * @param path2 * :壓縮后的文件路徑 * @throws Exception */ public void CompressFile(String path1, String path2) throws Exception { // 從文件中得到字節(jié)數(shù)組 byte[] b = CompressFileOption.readFile(path1); int b_size = b.length;// 原文件大小 byte[] b_compress;// 字節(jié)數(shù)組,存放壓縮的字符串 S

51、tring hfmcode = "";// 文件內(nèi)所有字節(jié)的哈夫曼編碼 String hfmcode_next;// 文件中每個(gè)字節(jié)的哈夫曼編碼 // 計(jì)算字符串中每個(gè)字節(jié)的權(quán)值,并返回一個(gè)存放字節(jié)和它對應(yīng)權(quán)值的節(jié)點(diǎn)隊(duì)列 List list = calWeight.calweight(b); int size = list.size(); Huffman hfm = new Huffman(); // 構(gòu)建哈夫曼樹并返回根節(jié)點(diǎn) TreeNode root = hfm.createHuffman(list); // 創(chuàng)建哈夫曼編

52、碼使其與字符一一對應(yīng) hfm.createHfmCode(root, ""); java.util.HashMap map = hfm.getMap();// 得到碼表 List listBy = hfm.getList();// 得到存放關(guān)鍵碼隊(duì)列 System.out.println("mapsize---->:" + map.size()); System.out.println("b---->:" + b.length); for (int i = 0; i < b_size; i++) { /

53、/ 得到每個(gè)字節(jié)的哈夫曼編碼 hfmcode_next = map.get(b[i]); System.out.println("第"+i+"個(gè): " + b[i] + "的編碼:" + hfmcode_next); hfmcode = hfmcode + hfmcode_next;// 將每個(gè)字節(jié)的哈夫曼編碼依次相加為一個(gè)01字符串 } System.out.println("01串大?。? + hfmcode.length()); System.out.println("01串:" + hfmcode); char[] ch = hfmcod

54、e.toCharArray(); System.out.println("01串的大?。? + ch.length); b_compress = StringToByteArray(hfmcode);// 得到字節(jié)數(shù)組 for (int i = 0; i < b_compress.length; i++) { System.out.println("第" + i + "個(gè)字節(jié)" + b_compress[i]); } // 將文件大小和碼表相關(guān)信息寫入文件 writeMap(b_size, map, listBy, path2); // 將

55、字節(jié)數(shù)組寫入文件 writeFile(b_compress, path2); } 2、解壓縮文件 Java代碼 ? 1. /** ? 2. ?*?解壓縮的文件操作 ? 3. ?*? ? 4. ?*?@author?king ? 5. ?*? ? 6. ?*/?? 7. public?class?UncompressFileOption?{ ?? 8. ?? 9. ????public?static?long?fileSize; ?? 10. ?? 11. ????/** ? 12. ?????*?將8位10字符串前面缺0的補(bǔ)上0 ? 13. ?

56、????*? ? 14. ?????*?@param?str ? 15. ?????*?@return ? 16. ?????*/?? 17. ????private?String?addZero(String?str)?{ ?? 18. ????????int?strLen?=?str.length(); ?? 19. ????????int?zeroNum; ?? 20. ????????if?(strLen?

57、for?(int?i?=?0;?i?

58、 35. ????private?String?InttoBinaryString(int[]?n)?{ ?? 36. ????????int?len?=?n.length; ?? 37. ????????String[]?s?=?new?String[len];//?一個(gè)字符串?dāng)?shù)組存放二進(jìn)制數(shù)據(jù) ?? 38. ????????String?BinaryStr?=?""; ?? 39. ????????for?(int?i?=?0;?i?

59、 ?? 41. ????????????s[i]?=?addZero(s[i]); ?? 42. ????????????BinaryStr?=?BinaryStr?+?s[i]; ?? 43. ????????} ?? 44. ????????System.out.println("二進(jìn)制形式表示:"?+?BinaryStr); ?? 45. ????????int?BinaryStrLen?=?BinaryStr.length();//?得到為減0前的字符串大小 ?? 46. ????????int?zeroSub?=?n[len?-?1];//?之前在末尾補(bǔ)0的個(gè)數(shù),現(xiàn)在減去

60、 ?? 47. ????????System.out.println("減0前的字符串大小:"?+?BinaryStrLen); ?? 48. ????????System.out.println("需要在字符串末尾減0的個(gè)數(shù)表示:"?+?zeroSub); ?? 49. ????????BinaryStr?=?BinaryStr.substring(0,?BinaryStrLen?-?zeroSub); ?? 50. ????????System.out.println("減0后的字符串大小:"?+?(BinaryStrLen?-?zeroSub)); ?? 51. ???????

61、?System.out.println("減0后的二進(jìn)制形式表示:"?+?BinaryStr); ?? 52. ????????return?BinaryStr; ?? 53. ????} ?? 54. ?? 55. ????/** ? 56. ?????*?字符串匹配,判斷字符串child是否為parent的前子串 ? 57. ?????*? ? 58. ?????*?@param?parent ? 59. ?????*?@param?child ? 60. ?????*?@return ? 61. ?????*/?? 62. ????private?boolean?S

62、tringMatch(String?parent,?String?child)?{ ?? 63. ?? 64. ????????char[]?p?=?parent.toCharArray(); ?? 65. ????????char[]?c?=?child.toCharArray(); ?? 66. ????????//?System.out.println("數(shù)組p的長度:"?+?p.length); ?? 67. ????????//?System.out.println("數(shù)組c的長度:"?+?c.length); ?? 68. ????????boolean?b?=?fal

63、se; ?? 69. ????????for?(int?i?=?0;?i?

64、turn?b; ?? 78. ????} ?? 79. ?? 80. ????/** ? 81. ?????*?解壓縮文件 ? 82. ?????*? ? 83. ?????*?@param?path2 ? 84. ?????*????????????:壓縮后的文件路徑 ? 85. ?????*?@param?path3 ? 86. ?????*????????????:解壓縮后的文件路徑 ? 87. ?????*?@throws?Exception ? 88. ?????*/?? 89. ????public?void?UncompressFile(String?pa

65、th2,?String?path3)?throws?Exception?{ ?? 90. ?? 91. ????????HashMap?map?=?new?HashMap(); ?? 92. ????????java.io.FileInputStream?fis?=?new?java.io.FileInputStream(path2); ?? 93. ????????java.io.DataInputStream?dis?=?new?java.io.DataInputStream(fis); ?? 94. ?? 95. ???

66、?????java.io.FileOutputStream?fos?=?new?java.io.FileOutputStream(path3); ?? 96. ?? 97. ????????fileSize?=?dis.readInt();//?得到原文件的大小 ?? 98. ????????int?mapSize?=?dis.readInt();//?得到碼表的大小 ?? 99. ????????byte[]?mapKey?=?new?byte[mapSize];//?創(chuàng)建一個(gè)字符數(shù)組,存放碼表中的字節(jié) ?? 100. ????????byte?codeSize;//?每個(gè)字節(jié)對應(yīng)的哈夫曼編碼大小 ?? 101. ????????String?hfmcode_next?=?""; ?? 102. ????????//?讀取碼表內(nèi)容 ?? 103. ????????for?(int?i?=?0;?i?

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!