ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:16.43KB ,
资源ID:4148680      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4148680.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(哈夫曼压缩解压算法源码.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

哈夫曼压缩解压算法源码.docx

1、哈夫曼压缩解压算法源码哈夫曼压缩解压算法源码HUFFMAN.C #include #include #include main(argc, argv) int argc; char *argv; int f,er; int len,arc; char *inbuff; char *outbuff; char fname80; char ch; if( argc 2 ) puts( Get me params ! ); exit( 1 ); strcpy( fname,argv1 ); f = _open( fname,O_RDONLY ); if( f 0 ) puts( Open error

2、 ); exit( 1 ); len = (int)filelength( f ); if( len 0 ) puts( File too large ); exit( 1 ); inbuff = malloc( len ); if( inbuff = NULL ) puts( Not enough memory ); exit( 1 ); len = _read( f,inbuff,len ); if( len 0 ) puts( Read error ); exit( 1 ); _close( f ); if( !ntIsarc( inbuff+1 ) outbuff = malloc(

3、len ); if( outbuff = NULL ) puts( Not enough memory ); exit( 1 ); printf( Packing %s to ,fname ); ch = *fname; *fname = $; printf( %s. ,fname ); arc = ntEncode( outbuff,inbuff,len ); if( arc = 0 ) puts( Encode failure ); exit( 1 ); f = _creat( fname,FA_ARCH ); if( f 0 ) puts( Create error ); exit( 1

4、 ); er = _write( f,&ch,1 ); er = _write( f,outbuff,arc ); if( er 0 ) puts( Write error ); exit( 1 ); _close( f ); printf( Success. %.2f%n,(float)(len-arc)/(float)len)*100.0 ); else len = ntGetorig( inbuff+1 ); outbuff = malloc( len ); if( outbuff = NULL ) puts( Not enough memory ); exit( 1 ); printf

5、( Unpacking %s to ,fname ); *fname = *inbuff; printf( %s. ,fname ); arc = ntDecode( outbuff,inbuff+1 ); if( arc = 0 ) puts( Decode failure ); exit( 1 ); f = _creat( fname,FA_ARCH ); if( f 0 ) puts( Create error ); exit( 1 ); er = _write( f,outbuff,len ); if( er 0 ) puts( Write error ); exit( 1 ); _c

6、lose( f ); puts( Success. ); NTDECODE.C #define US 037 #define RS 036 char *_inp; char *_outp; int _origsize; short _dmaxlev; short _intnodes25; char *_tree25; char _characters256; char *_eof; int ntDecode( outbuff,inbuff ) char *outbuff; char *inbuff; int c, i, nchildren; int inleft; _eof = &_chara

7、cters0; if (inbuff0 != US) return( 0 ); if (inbuff1 != RS) return( 0 ); _inp = &inbuff2; _origsize = 0; for (i=0; i 24) return( 0 ); for (i=1; i=_dmaxlev; i+) _intnodesi = *_inp+ & 0377; for (i=1; i0; c-) if (_eof = &_characters255) return( 0 ); *_eof+ = *_inp+; *_eof+ = *_inp+; _intnodes_dmaxlev +=

8、 2; inleft -= _inp - &inbuff0; if (inleft =1; i-) c = _intnodesi; _intnodesi = nchildren /= 2; nchildren += c; return ( _decode( inleft,outbuff ); _decode( inleft,outbuff ) int inleft; char *outbuff; int bitsleft, c, i; int j, lev; char *p; _outp = &outbuff0; lev = 1; i = 0; while (1) if (-inleft =

9、0) i *= 2; if (c & 0200) i+; c = 0) p = &_treelevj; if (p = _eof) c = _outp - &outbuff0; _origsize -= c; if (_origsize != 0) return( 0 ); return (1); *_outp+ = *p; lev = 1; i = 0; else lev+; NTENCODE.C #define END 256 union FOUR struct long lng; lint; struct char c0, c1, c2, c3; chars; ; long _count

10、 END+1 ; union FOUR _insize; int _diffbytes; int _maxlev; int _levcount 25 ; int _lastnode; int _parent 2*END+1 ; char _length END+1 ; long _bits END+1 ; union FOUR _mask; long _inc; char *_maskshuff4 = &(_mask.chars.c3), &(_mask.chars.c2), &(_mask.chars.c1), &(_mask.chars.c0); int _n_; struct _heap

11、 long count; int node; _heap END+2 ; #define hmove(a,b) (b).count = (a).count; (b).node = (a).node; int ntEncode( outbuff,inbuff,buflen ) char *outbuff; char *inbuff; int buflen; register int c, i, p; long bitsout; _input( inbuff,buflen ); _diffbytes = -1; _count END = 1; _insize.lint.lng = 0L; _n_

12、= 0; for (i=END; i=0; i-) _parenti = 0; if (_counti 0) _diffbytes+; _insize.lint.lng += _counti; _heap+_n_.count = _counti; _heap_n_.node = i; if (_diffbytes = 1) return( 0 ); _insize.lint.lng = 1; for (i=_n_/2; i=1; i-) _heapify(i); _lastnode = END; while (_n_ 1) _parent_heap1.node = +_lastnode; _i

13、nc = _heap1.count; hmove (_heap_n_, _heap1); _n_-; _heapify(1); _parent_heap1.node = _lastnode; _heap1.node = _lastnode; _heap1.count += _inc; _heapify(1); _parent_lastnode = 0; bitsout = _maxlev = 0; for (i=1; i=24; i+) _levcounti = 0; for (i=0; i _maxlev) _maxlev = c; bitsout += c*(_counti1); if (

14、_maxlev 24) return( 0 ); _inc = 1L = _maxlev; _mask.lint.lng = 0; for (i=_maxlev; i0; i-) for (c=0; c=END; c+) if (_lengthc = i) _bitsc = _mask.lint.lng; _mask.lint.lng += _inc; _mask.lint.lng &= _inc; _inc = 1; return( _output( outbuff,inbuff,buflen ); _input ( inbuff,buflen ) char *inbuff; int buf

15、len; register int i; for (i=0; i 0) _countinbuff-buflen&0377 += 2; int _output( outbuff,inbuff,buflen ) char *outbuff; char *inbuff; int buflen; int c, i; char *inp; register char *q, *outp; register int bitsleft; long temp; outbuff0 = 037; /* ascii US */ outbuff1 = 036; /* ascii RS */ temp = _insiz

16、e.lint.lng; for (i=5; i=2; i-) outbuffi = (char) (temp & 0377); temp = 8; outp = outbuff+6; *outp+ = _maxlev; for (i=1; i_maxlev; i+) *outp+ = _levcounti; *outp+ = _levcount_maxlev-2; for (i=1; i=_maxlev; i+) for (c=0; cEND; c+) if (_lengthc = i) *outp+ = c; inp = inbuff; bitsleft = 8; do c = (-bufl

17、en 0) ? END : (*inp+ & 0377); _mask.lint.lng = _bitscbitsleft; q = &_maskshuff0; if (bitsleft = 8) *outp = *q+; else *outp |= *q+; bitsleft -= _lengthc; while (bitsleft 0) *+outp = *q+; bitsleft += 8; while (c != END); if (bitsleft 8) outp+; c = outp-outbuff; return (c); _heapify( i ) int i; registe

18、r int k; int lastparent; struct _heap heapsubi; hmove (_heapi, heapsubi); lastparent = _n_/2; while (i _heapk+1.count & k _n_) k+; if (heapsubi.count _heapk.count) break; hmove (_heapk, _heapi); i = k; hmove (heapsubi, _heapi); NTGETORI.C int ntGetorig( inbuff ) char *inbuff; int i; char *in; int size; in = inbuff+2; size = 0; for (i=0; i4; i+) size = size*256 + (*in+) & 0377); return( size ); NTISARC.C #define US 037 #define RS 036 int ntIsarc( inbuff ) char *inbuff; if( inbuff0 = US & inbuff1 = RS ) return( 1 ); else return( 0 );

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1