接下来,要做的就是获得0——256之间每个字节所对应的哈弗曼编码,用一个String[] Code = new Code[256]保存 下来Java代码//获得编码
! Q/ R: B, p/ _: E4 n/ m+ x private void getStrByte(hfmNode node,String s){
( S# @) K1 b2 K, ^% M$ H5 n if(node.getLeft()==null&&node.getRight()==null){
: U- _* Z6 A9 E& S2 y; K2 V% d Code[node.getData()] = s;//获得编码字符串
$ j, O$ J- ^+ d* `- C5 W' m }
. n8 Z% m- t8 Z2 a: M if(node.getLeft()!=null){ " s3 A q5 _9 p% w6 V' v+ w. c
getStrByte(node.getLeft(),s+"0"); 2 }1 s8 Y5 i: A8 @' D+ [9 H. \* d
}//左零 if(node.getRight()!=null){
$ U) l4 A2 r" S4 Y, c getStrByte(node.getRight(),s+"1"); * m# g, |; W" E5 A- b/ |. f
}//右1 $ M$ M5 M2 A" g: E' s8 }' O
} 1 M: b* ]7 u* L# s. c% j
然后就是把每个字节的编码长度打入文件:Java代码//先将0-255的编码长度打到文件里
4 o) a) \* ~, v, m" c for(int i=0;i
* @* b ^- g+ l9 V, L9 r if(Code==null||Code==""){ 转自:考试网 - [Examw.Com]
+ d2 X$ Q& `6 O- W2 |0 N Code = ""; % Y; R0 b) h. b' U2 ^: D# B
bos.write(0);
/ x. y4 B ^' B7 l+ {8 I }else{
; _! ~" W+ y9 z+ D9 f bos.write(Code.length());
% W/ ~0 e5 N7 J } 7 Q5 A6 [" Z. Z* H
} & V) O/ z9 O9 q. Z5 z
接下来就是,将每个字节的编码打入文件(这里需要吧8个长度的01串转换成一个byte打入文件):Java代码//把每个字节的编码表打到文件里 ' p& |2 I' d( o" M
int i = 0;//第i个字节
; a3 y: [ r' Q int count = 0;//满8打一,计数器
8 Y0 Y) i# {% Z. {5 T4 Z$ P String writeCode = "";//写入的8位编码 ! L, ?) f% Z) Q) m7 F
String allCode = "";//所有待写入的编码
, y$ p# H8 Q, C& H% I2 g String inCode = ""; ' M; \% V. o3 W* a3 v) N( s9 u
while(i=8){ ! I2 y9 d) b3 N2 M, P2 J' y `, H
if(count>=8){//满8 5 \8 O$ F* ^) e
writeCode = allCode.substring(0,8);//前8位 5 ]5 ]% m0 E, }$ A }
count-=8; 0 b; ]8 N, _. o2 C1 K6 N
allCode = allCode.substring(8); % u$ m9 Y/ A3 S2 G- B5 e6 ^2 `. F8 q' {
bos.write(changeString(writeCode));//写入一个字节 " Q3 u- C8 S& h- U2 l4 S0 k D
}else{ + t5 o( {4 G) X
count+=Code.length(); 5 k% t) ^# B4 b
allCode+=Code; 6 C( ]& U' ^( Y% D$ q# k* B6 Y9 B
inCode+=Code; 0 m9 b# w# u9 m
i++;//严重错误发生地 : R; c0 ]' _. l$ x1 z
} 5 k% y ]4 M+ Z4 h0 X! V
}
9 X1 J, T. ^) ^& E3 P* q' q //如果不满8位的
$ b0 @1 q( S x% J m+ T4 G if(allCode.length()>0){
( e" m! @: y' L s int len = 8-allCode.length();//补零
$ E$ n, u% k5 w T0 X; y for(int j=0;j # {7 i9 N( {, o3 h8 v2 ]- F7 n
allCode+="0";
; Q/ g1 _" n% K; K s } ) S, I( Q0 {3 a+ B2 P1 c) @6 \
inCode+=allCode;
1 o" A5 y3 P) t8 W bos.write(changeString(allCode)); 7 a/ G0 h" L% L, |
} |