壓縮軟件(哈夫曼算法實現(xiàn))
《壓縮軟件(哈夫曼算法實現(xiàn))》由會員分享,可在線閱讀,更多相關(guān)《壓縮軟件(哈夫曼算法實現(xiàn))(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、壓縮軟件(哈夫曼算法實現(xiàn)) 項目總結(jié) 算法CC++C#DOS 一、在講具體代碼實現(xiàn)之前,先給大家普及一下壓縮軟件的相關(guān)知識 引用 壓縮軟件是利用算法將文件有損或無損地處理,以達到保留最多文件信息,而令文件體積變小的應用軟件。壓縮軟件一般同時具有解壓縮的功能。壓縮軟件的的基本原理是查找文件內(nèi)的重復字節(jié),并建立一個相同字節(jié)的"詞典"文件,并用一個代碼表示,比如在文件里有幾處有一個相同的詞"中華人民共和國"用一個代碼表示并寫入"詞典"文件,這樣就可以達到縮小文件的目的。常見的壓縮軟件有WinRAR ,好壓(Haozip),WinZip,7-Zip,WinMount,Peazip等等。
2、 ??????? 哈夫曼樹作為數(shù)據(jù)結(jié)構(gòu)二叉樹章節(jié)中最為華彩的一部分,有著其獨特的魅力。給定n個權(quán)值作為n個葉子結(jié)點,構(gòu)造一棵二叉樹,若帶權(quán)路徑長度達到最小,這樣的二叉樹便是哈夫曼樹,也稱為最優(yōu)二叉樹?!? ??????? 二、哈夫曼算法? 引用 ??????? Huffman算法是一種基于統(tǒng)計的壓縮方法。它的本質(zhì)就是對文本文件中的字符進行重新編碼,對于使用頻率越高的字符,其編碼也越短。但是任何2個字符的編碼, 是不能出現(xiàn)向前包含的。也就是說字符A(假設(shè)為00)的編碼的前段,不可能為字符B(則B的編碼不可能為001,因為這里B的編碼中包含了A的前段00,這會給解碼難帶來不必要的困
3、難,所以這是不允許的)的編碼。經(jīng)過編碼后的文本文件,主要包含2個部分:Huffman碼表部分和壓縮內(nèi)容部分。解壓縮的時候,先把Huffman碼表取出來,然后對壓縮內(nèi)容部分各個字符進行逐一解碼,形成源文件。 ??????? 哈夫曼編碼生成步驟: ??????? ①掃描要壓縮的文件,對字符出現(xiàn)的頻率進行計算。 ??????? ②把字符按出現(xiàn)的頻率進行排序,組成一個隊列。 ??????? ③把出現(xiàn)頻率最低(權(quán)值)的兩個字符作為葉子節(jié)點,它們的權(quán)值之和為根節(jié)點組成一棵樹。 ??????? ④把上面葉子節(jié)點的兩個字符從隊列中移除,并把它們組成的根節(jié)點加入到隊列。 ???????
4、⑤把隊列重新進行排序。重復步驟③④⑤直到隊列中只有一個節(jié)點為止。 ??????? ⑥把這棵樹上的根節(jié)點定義為0(可自行定義0或1)左邊為0,右邊為1。這樣就可以得到每個葉子節(jié)點的哈夫曼編碼了。 ??????? 三、編碼流程(大體思路) ??????? 壓縮: ??????? 1、將要壓縮的文件一個一個字節(jié)的讀出來即掃描要壓縮的文件,并統(tǒng)計每個字節(jié)的權(quán)值即出現(xiàn)的頻率。 ??????? 2、以每個字節(jié)的權(quán)值來構(gòu)造哈夫曼樹,并給每個字節(jié)進行哈夫曼編碼。 ??????? 3、將每個字節(jié)和其對應得哈夫曼編碼存放進一個Map中,即碼表。 ??????? 4、以這個碼表為依照
5、,將文件中的所有字節(jié)一一進行編碼(生成10字符串),最后在把所有字節(jié)的編碼依次末尾相加合成一個10字符串。 ??????? 5、將這個10字符串重新組合,8個為一組,若最后一組不足8個則補0,并記錄補0的個數(shù),將每一組的10字符串轉(zhuǎn)化為一個字節(jié), 并將所有的10字符串合成一個字節(jié)數(shù)組,數(shù)組的最后一個元素存放補0的個數(shù)。 ??????? 6、創(chuàng)建一個壓縮文件,先將碼表的大小寫入文件,再將碼表寫入文件(碼表里還有每個字節(jié)的哈夫曼編碼長度的信息)。 ??????? 7、最后將之前生成的字節(jié)數(shù)組寫入文件(文件的主要信息)。 ??????? 解壓縮: ??????? 1、將壓縮的
6、文件同樣一個一個字節(jié)的讀出來。 ??????? 2、先讀出碼表的大小,再通過碼表的大小讀出碼表,并將碼表的信息存放進一個Map。 ??????? 3、再接著讀出后面的所有字節(jié),并轉(zhuǎn)化成一個10字符串。 ??????? 4、通過與碼表的匹配,從10字符串的第一個字符開始讀,若讀到的子字符串與碼表的某個字節(jié)的的編碼相同,解壓出相應的字節(jié),把該字節(jié)保存起來。 并把上面的子字符串從編碼中刪除,重復上一步驟,直到該項編碼解析完成,最后將此10字符串還原成原來的文件的一個個字節(jié)。 ??????? 5、再將這些字節(jié)寫入一個新的文件,后綴名改成和原來文件一樣,就能打開了。 ????
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)鍵碼的字符隊列 ? 40. ?????*?@param?path ? 41. ?????*????????????:文件路徑 ? 42. ?????*?@th
11、rows?Exception ?
43. ?????*/??
44. ????public?static?void?writeMap(int?fileSize, ??
45. ????????????java.util.HashMap
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));//?將每個字節(jié)寫入文件 ?? 56. ????????????String?hfmcode_next?=?map.get(listBy.get(i));//?得到每個字節(jié)對應的哈夫曼編碼 ?? 57. ????????????byte?codeSize?=?(byte)?hfmcode_next.length();//?每個字節(jié)對應的哈夫曼編碼大小 ?? 58. ????????????fos.write(codeSize);//?將每個字節(jié)對應的哈夫曼編碼大小寫入文件 ?? 59. ????
14、????????dos.writeChars(hfmcode_next);//?將每個字符對應的哈夫曼編碼寫入文件 ?? 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)化為一個字節(jié) ? 92. ?????*? ? 93. ?????*?@param?str ? 94. ?????*????????????:傳入的字符串 ? 95. ?????*?@return:一個字節(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個為一組轉(zhuǎn)化為一個字節(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;//?字符串字符的個數(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?+?"個字符串:"?+?s); ?? 136. ????????????????b[i]?=?CharArrayToByte(s); ?? 137. ????????????????s?=?""; ?? 138. ????????????????System.out.println("第"?+?i?+?"個字符串轉(zhuǎn)化為字節(jié)后的值:"?+?b[i]); ?? 139. ????????????} ?? 140. ????????????b[lenByte?-?1]?=?0;//?字節(jié)數(shù)組的最后一個存放補0的個數(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;//?補0的個數(shù) ?? 147. ????????????System.out.println("補0數(shù):"?+?zeroNum);
25、?? 148. ????????????System.out.println("原字符串:"?+?str); ?? 149. ????????????for?(int?i?=?0;?i?
26、 ????????????System.out.println("補0后的字符串的字符個數(shù):"?+?c.length); ?? 155. ????????????for?(int?i?=?0;?i?
27、?????} ?? 160. ????????????????System.out.println("第"?+?i?+?"個字符串:"?+?s); ?? 161. ????????????????b[i]?=?CharArrayToByte(s); ?? 162. ????????????????s?=?""; ?? 163. ????????????????System.out.println("第"?+?i?+?"個字符串轉(zhuǎn)化為字節(jié)后的值:"?+?b[i]); ?? 164. ????????????} ?? 165. ????????????b[lenByte?-?1]?=?
28、(byte)?zeroNum;//?字節(jié)數(shù)組的最后一個存放補0的個數(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;//?文件中每個字節(jié)的哈夫曼編碼 ??
187. ????????//?計算字符串中每個字節(jié)的權(quán)值,并返回一個存放字節(jié)和它對應權(quán)值的節(jié)點隊列 ??
188. ????????List
31、????Huffman?hfm?=?new?Huffman(); ??
191. ????????//?構(gòu)建哈夫曼樹并返回根節(jié)點 ??
192. ????????TreeNode?root?=?hfm.createHuffman(list); ??
193. ????????//?創(chuàng)建哈夫曼編碼使其與字符一一對應 ??
194. ????????hfm.createHfmCode(root,?""); ??
195. ??
196. ????????java.util.HashMap
32、 ????????List 33、?hfmcode_next?=?map.get(b[i]); ??
204. ????????????System.out.println("第"+i+"個:?"?+?b[i]?+?"的編碼:"?+?hfmcode_next); ??
205. ????????????hfmcode?=?hfmcode?+?hfmcode_next;//?將每個字節(jié)的哈夫曼編碼依次相加為一個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?+?"個字節(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)鍵碼的字符隊列
* @param path
* :文件路徑
* @throws Exception
*/
public static void writeMap(int fileSize,
java.util.HashMap 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));// 將每個字節(jié)寫入文件
String hfmcode_next = map.get(listBy.get(i));// 得到每個字節(jié)對應的哈夫曼編碼
byte codeSize = (byte) hfmcode_next.length();// 每個字節(jié)對應的哈夫曼編碼大小
fos.write(codeSize);// 將每個字節(jié)對應的哈夫曼編碼大小寫入文件
dos.writeChars(hfmcode_next);// 將每個字符對應的哈夫曼編碼寫入文件
}
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)化為一個字節(jié)
*
* @param str
* 43、 :傳入的字符串
* @return:一個字節(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));// 冪計算
value = (byte) (value + value_next);
}
return value;
}
/**
* 將10字符串以8個為一組轉(zhuǎn)化為一個字節(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;// 字符串字符的個數(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 + "個字符串:" + s);
b[i] = CharArrayToByte(s);
s = "";
System.out.println("第" + i + "個字符串轉(zhuǎn)化為字節(jié)后的值:" + b[i]);
}
b[lenByte - 1] = 0;// 47、 字節(jié)數(shù)組的最后一個存放補0的個數(shù)
} else {// 如果字符串的長度不能被8整除
lenByte = len / 8 + 2;
b = new byte[lenByte];
int remainder = len % 8;// 求出除8的余數(shù)
int zeroNum = 8 - remainder;// 補0的個數(shù)
System.out.println("補0數(shù):" + zeroNum);
System.out.println("原字符串:" + str);
for (int i = 0; i < zeroNum; i++ 48、) {
str = str + '0';// 在字符串后面補0
}
System.out.println("補0后的字符串:" + str);
c = str.toCharArray();
System.out.println("補0后的字符串的字符個數(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 + "個字符串:" + s);
b[i] = CharArrayToByte(s);
s = "";
System.out.println("第" + i + "個字符串轉(zhuǎn)化為字節(jié)后的值:" + b[i]);
}
b[lenByte - 1] = (byte) zeroNum;// 字節(jié)數(shù)組的最后一個存放補0的個數(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;// 文件中每個字節(jié)的哈夫曼編碼
// 計算字符串中每個字節(jié)的權(quán)值,并返回一個存放字節(jié)和它對應權(quán)值的節(jié)點隊列
List 52、碼使其與字符一一對應
hfm.createHfmCode(root, "");
java.util.HashMap 53、/ 得到每個字節(jié)的哈夫曼編碼
hfmcode_next = map.get(b[i]);
System.out.println("第"+i+"個: " + b[i] + "的編碼:" + hfmcode_next);
hfmcode = hfmcode + hfmcode_next;// 將每個字節(jié)的哈夫曼編碼依次相加為一個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 + "個字節(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的補上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?8)?{//?若字符串長度小于8則補0 ??
21. ????????????zeroNum?=?8?-?strLen; ??
22. ???????????? 57、for?(int?i?=?0;?i?
58、
35. ????private?String?InttoBinaryString(int[]?n)?{ ??
36. ????????int?len?=?n.length; ??
37. ????????String[]?s?=?new?String[len];//?一個字符串數(shù)組存放二進制數(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("二進制形式表示:"?+?BinaryStr); ??
45. ????????int?BinaryStrLen?=?BinaryStr.length();//?得到為減0前的字符串大小 ??
46. ????????int?zeroSub?=?n[len?-?1];//?之前在末尾補0的個數(shù),現(xiàn)在減去 60、 ??
47. ????????System.out.println("減0前的字符串大小:"?+?BinaryStrLen); ??
48. ????????System.out.println("需要在字符串末尾減0的個數(shù)表示:"?+?zeroSub); ??
49. ????????BinaryStr?=?BinaryStr.substring(0,?BinaryStrLen?-?zeroSub); ??
50. ????????System.out.println("減0后的字符串大小:"?+?(BinaryStrLen?-?zeroSub)); ??
51. ??????? 61、?System.out.println("減0后的二進制形式表示:"?+?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 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)建一個字符數(shù)組,存放碼表中的字節(jié) ??
100. ????????byte?codeSize;//?每個字節(jié)對應的哈夫曼編碼大小 ??
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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 指向核心素養(yǎng)發(fā)展的高中生物學1輪復習備考建議
- 新課程新評價新高考導向下高三化學備考的新思考
- 新時代背景下化學高考備考策略及新課程標準的高中化學教學思考
- 2025屆江西省高考政治二輪復習備考建議
- 新教材新高考背景下的化學科學備考策略
- 新高考背景下的2024年高考化學二輪復習備考策略
- 2025屆高三數(shù)學二輪復習備考交流會課件
- 2025年高考化學復習研究與展望
- 2024年高考化學復習備考講座
- 2025屆高考數(shù)學二輪復習備考策略和方向
- 2024年感動中國十大人物事跡及頒獎詞
- XX教育系統(tǒng)單位述職報告教育工作概述教育成果展示面臨的挑戰(zhàn)未來規(guī)劃
- 2025《增值稅法》全文解讀學習高質(zhì)量發(fā)展的增值稅制度規(guī)范增值稅的征收和繳納
- 初中資料:400個語文優(yōu)秀作文標題
- 初中語文考試專項練習題(含答案)