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