a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 60|回复: 0

[基础知识] JAVA基础:用哈弗曼编码实现压缩软件(2)

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
接下来,要做的就是获得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, |
  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 21:32 , Processed in 0.173927 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表