PeeperZip.h
上传用户:xztxsm
上传日期:2007-02-12
资源大小:150k
文件大小:20k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // 远程控制软件-偷窥者  压缩库                                               //
  3. // 日期:2001/10/02                                                           //
  4. // 作者:刘东发                                                               //
  5. // Email:dongfa@yeah.net                                                     //
  6. // http://dongfa.yeah.net                                                    //
  7. // OICQ:5584173  阿东                                                        //
  8. // 作者声明:                                                                 //
  9. //     此部分代码是从网上下载获得,经过本人的改写, 变得容易使用,希望能给   //
  10. // 大家带来方便.                                                             //
  11. ///////////////////////////////////////////////////////////////////////////////
  12. #ifndef __PEEPER_ZIP_H__
  13. #define __PEEPER_ZIP_H__
  14. ///////////////////////////////////////////////////////////////////////////////
  15. //LZ77 Part START--------------------------------------------------------------
  16. ///////////////////////////////////////////////////////////////////////////////
  17. #define _MAX_WINDOW_SIZE 65536
  18. class CCompress
  19. {
  20. public:
  21. CCompress() {};
  22. virtual ~CCompress() {};
  23. public:
  24. virtual int Compress(BYTE* src, int srclen, BYTE* dest) = 0;
  25. virtual BOOL Decompress(BYTE* src, int srclen, BYTE* dest) = 0;
  26. protected:
  27. void CopyBitsInAByte(BYTE* memDest, int nDestPos, 
  28.   BYTE* memSrc, int nSrcPos, int nBits);
  29. void CopyBits(BYTE* memDest, int nDestPos, 
  30.   BYTE* memSrc, int nSrcPos, int nBits);
  31. void InvertDWord(DWORD* pDW);
  32. void SetBit(BYTE* byte, int iBit, BYTE aBit);
  33. BYTE GetBit(BYTE byte, int pos);
  34. void MovePos(int* piByte, int* piBit, int num);
  35. int UpperLog2(int n);
  36. int LowerLog2(int n);
  37. };
  38. class CCompressLZ77 : public CCompress
  39. {
  40. public:
  41. CCompressLZ77();
  42. virtual ~CCompressLZ77();
  43. public:
  44. int Compress(BYTE* src, int srclen, BYTE* dest);
  45. BOOL Decompress(BYTE* src, int srclen, BYTE* dest);
  46. protected:
  47. BYTE* pWnd;
  48. int nWndSize;
  49. struct STIDXNODE
  50. {
  51. WORD off;
  52. WORD off2;
  53. WORD next;
  54. };
  55. WORD SortTable[65536];
  56. struct STIDXNODE* SortHeap;
  57. int HeapPos;
  58. int CurByte, CurBit;
  59. protected:
  60. void _OutCode(BYTE* dest, DWORD code, int bits, BOOL isGamma);
  61. BOOL _SeekPhase(BYTE* src, int srclen, int nSeekStart, int* offset, int* len);
  62. inline int _GetSameLen(BYTE* src, int srclen, int nSeekStart, int offset);
  63. inline void _ScrollWindow(int n);
  64. inline void _InsertIndexItem(int off);
  65. void _InitSortTable();
  66. };
  67. ///////////////////////////////////////////////////////////////////////////////
  68. //LZ77 Part END--------------------------------------------------------------
  69. ///////////////////////////////////////////////////////////////////////////////
  70. ///////////////////////////////////////////////////////////////////////////////
  71. //LZSS Part START--------------------------------------------------------------
  72. ///////////////////////////////////////////////////////////////////////////////
  73. #define LZSS_N 4096
  74. #define LZSS_F 18
  75. #define LZSS_THRESHOLD 2
  76. #define LZSS_NIL LZSS_N
  77. class C_LZSS
  78. {
  79. public:
  80. C_LZSS()
  81. {
  82. textsize = 0;
  83. codesize = 0;
  84. printcount = 0;
  85. }
  86. ~C_LZSS()
  87. {
  88. }
  89. HGLOBAL Encode(char *chData, int nSize);
  90. HGLOBAL Decode(char *chZipData, int nZipSize);
  91. protected:
  92. void InitTree(void)
  93. {
  94. int i = 0;
  95. for(i = LZSS_N + 1; i <= LZSS_N + 256; i++)
  96. {
  97. rson[i] = LZSS_NIL;
  98. }
  99. for(i = 0; i < LZSS_N; i++)
  100. {
  101. dad[i] = LZSS_NIL;
  102. }
  103. }
  104. void InsertNode(int r)
  105. {
  106. int i = 0;
  107. int p = 0;
  108. int cmp = 1;
  109. unsigned char *key = &text_buf[r];
  110. p = LZSS_N + 1 + key[0];
  111. rson[r] = lson[r] = LZSS_NIL;
  112. match_length = 0;
  113. for( ; ; )
  114. {
  115. if(cmp >= 0)
  116. {
  117. if(rson[p] != LZSS_NIL)
  118. {
  119. p = rson[p];
  120. }
  121. else
  122. {
  123. rson[p] = r;
  124. dad[r] = p;
  125. return ;
  126. }
  127. }
  128. else
  129. {
  130. if(lson[p] != LZSS_NIL)
  131. {
  132. p = lson[p];
  133. }
  134. else
  135. {
  136. lson[p] = r;
  137. dad[r] = p;
  138. return ;
  139. }
  140. }
  141. for(i = 1; i < LZSS_F; i++)
  142. {
  143. if ((cmp = key[i] - text_buf[p + i]) != 0)
  144. break;
  145. }
  146. if(i > match_length)
  147. {
  148. match_position = p;
  149. if((match_length = i) >= LZSS_F)
  150. break;
  151. }
  152. }
  153. dad[r] = dad[p];
  154. lson[r] = lson[p];
  155. rson[r] = rson[p];
  156. dad[lson[p]] = r;
  157. dad[rson[p]] = r;
  158. if(rson[dad[p]] == p)
  159. {
  160. rson[dad[p]] = r;
  161. }
  162. else
  163. {
  164. lson[dad[p]] = r;
  165. }
  166. dad[p] = LZSS_NIL;
  167. }
  168. void DeleteNode(int p)
  169. {
  170. int q = 0;
  171. if(dad[p] == LZSS_NIL)
  172. return ;
  173. if(rson[p] == LZSS_NIL)
  174. {
  175. q = lson[p];
  176. }
  177. else if(lson[p] == LZSS_NIL)
  178. {
  179. q = rson[p];
  180. }
  181. else
  182. {
  183. q = lson[p];
  184. if(rson[q] != LZSS_NIL)
  185. {
  186. do
  187. {
  188. q = rson[q];
  189. }while (rson[q] != LZSS_NIL);
  190. rson[dad[q]] = lson[q];
  191. dad[lson[q]] = dad[q];
  192. lson[q] = lson[p];
  193. dad[lson[p]] = q;
  194. }
  195. rson[q] = rson[p];
  196. dad[rson[p]] = q;
  197. }
  198. dad[q] = dad[p];
  199. if(rson[dad[p]] == p)
  200. {
  201. rson[dad[p]] = q;
  202. }
  203. else
  204. {
  205. lson[dad[p]] = q;
  206. }
  207. dad[p] = LZSS_NIL;
  208. }
  209. protected:
  210. unsigned long int textsize;
  211. unsigned long int codesize;
  212. unsigned long int printcount;
  213. unsigned char text_buf[LZSS_N + LZSS_F - 1];
  214. int match_position;
  215. int match_length;
  216. int lson[LZSS_N + 1];
  217. int rson[LZSS_N + 257];
  218. int dad[LZSS_N + 1];
  219. // FILE *infile;
  220. // FILE *outfile;
  221. };
  222. ///////////////////////////////////////////////////////////////////////////////
  223. //LZSS Part END--------------------------------------------------------------
  224. ///////////////////////////////////////////////////////////////////////////////
  225. ///////////////////////////////////////////////////////////////////////////////
  226. //ARI Part START--------------------------------------------------------------
  227. ///////////////////////////////////////////////////////////////////////////////
  228. #define ARI_N 4096
  229. #define ARI_F 60
  230. #define ARI_THRESHOLD 2
  231. #define ARI_NIL ARI_N
  232. #define ARI_M   15
  233. #define ARI_Q1  (1UL << ARI_M)
  234. #define ARI_Q2  (2 * ARI_Q1)
  235. #define ARI_Q3  (3 * ARI_Q1)
  236. #define ARI_Q4  (4 * ARI_Q1)
  237. #define ARI_MAX_CUM (ARI_Q1 - 1)
  238. #define ARI_N_CHAR  (256 - ARI_THRESHOLD + ARI_F)
  239. //缓冲数据区大小
  240. const int MAXSIZE = 65536;
  241. class C_ARI
  242. {
  243. public:
  244. C_ARI()
  245. {
  246. textsize = 0;
  247. codesize = 0;
  248. printcount = 0;
  249. low = 0;
  250. high = ARI_Q4;
  251. value = 0;
  252. shifts = 0;
  253. nCurPos = 0; //记下数据的位置
  254. nZipPos = 0; //记下压缩数据的位置
  255. nBufPos = 0; //记下当前存储位置hZip
  256. nZipSize = 0; //压缩后数据的大小
  257. m_nTotalSize = 0;
  258. m_hData = NULL;
  259. m_lpMemData = NULL;
  260. m_lpBuffer = NULL;
  261. }
  262. ~C_ARI()
  263. {
  264. }
  265. HGLOBAL Encode(char *chData, int nSize);
  266. HGLOBAL Decode(char *chZipData, int nZipSize);
  267. protected:
  268. void Error(char *message)
  269. {
  270. printf("n%sn", message);
  271. exit(EXIT_FAILURE);
  272. }
  273. void PutBit(int bit)
  274. {
  275. static unsigned int buffer = 0, mask = 128;
  276. if(bit)
  277. {
  278. buffer |= mask;
  279. }
  280. if((mask >>= 1) == 0)
  281. {
  282. //存储这个压缩字节
  283. if(nZipPos >= MAXSIZE)
  284. {
  285. nZipPos = 0;
  286. memcpy(m_lpMemData + nBufPos, byMaxBuf, MAXSIZE);
  287. nBufPos += MAXSIZE;
  288. ::GlobalUnlock(m_hData); //重新分配内存
  289. m_hData = ::GlobalReAlloc(m_hData, nBufPos + MAXSIZE, 0);
  290. m_lpMemData = (LPBYTE)::GlobalLock(m_hData);
  291. }
  292. byMaxBuf[nZipPos] = buffer;
  293. nZipPos ++;
  294. nZipSize ++; //当前压缩数据的大小
  295. buffer = 0;
  296. mask = 128;
  297. codesize++;
  298. }
  299. }
  300. void FlushBitBuffer(void)
  301. {
  302. for(int i = 0; i < 7; i ++)
  303. {
  304. PutBit(0);
  305. }
  306. }
  307. int GetBit(void)
  308. {
  309. static unsigned int buffer, mask = 0;
  310. if((mask >>= 1) == 0)
  311. {
  312. if(nCurPos < m_nTotalSize)
  313. {
  314. buffer = m_lpBuffer[nCurPos]; //add
  315. nCurPos ++; //add
  316. }
  317. mask = 128;
  318. }
  319. return ((buffer & mask) != 0);
  320. }
  321. void InitTree(void)
  322. {
  323. int i = 0;
  324. for(i = ARI_N + 1; i <= ARI_N + 256; i++)
  325. {
  326. rson[i] = ARI_NIL;
  327. }
  328. for(i = 0; i < ARI_N; i++)
  329. {
  330. dad[i] = ARI_NIL;
  331. }
  332. }
  333. void InsertNode(int r)
  334. {
  335. int i, p, cmp, temp;
  336. unsigned char *key;
  337. cmp = 1;
  338. key = &text_buf[r];
  339. p = ARI_N + 1 + key[0];
  340. rson[r] = lson[r] = ARI_NIL;
  341. match_length = 0;
  342. for( ; ; )
  343. {
  344. if(cmp >= 0)
  345. {
  346. if(rson[p] != ARI_NIL)
  347. {
  348. p = rson[p];
  349. }
  350. else
  351. {
  352. rson[p] = r;
  353. dad[r] = p;
  354. return;
  355. }
  356. }
  357. else
  358. {
  359. if(lson[p] != ARI_NIL)
  360. {
  361. p = lson[p];
  362. }
  363. else
  364. {
  365. lson[p] = r;
  366. dad[r] = p;
  367. return ;
  368. }
  369. }
  370. for(i = 1; i < ARI_F; i ++)
  371. {
  372. if((cmp = key[i] - text_buf[p + i]) != 0)
  373. break;
  374. }
  375. if(i > ARI_THRESHOLD)
  376. {
  377. if (i > match_length)
  378. {
  379. match_position = (r - p) & (ARI_N - 1);
  380. if((match_length = i) >= ARI_F)
  381. {
  382. break;
  383. }
  384. }
  385. else if (i == match_length)
  386. {
  387. if ((temp = (r - p) & (ARI_N - 1)) < match_position)
  388. match_position = temp;
  389. }
  390. }
  391. }
  392. dad[r] = dad[p];
  393. lson[r] = lson[p];
  394. rson[r] = rson[p];
  395. dad[lson[p]] = r;
  396. dad[rson[p]] = r;
  397. if(rson[dad[p]] == p)
  398. {
  399. rson[dad[p]] = r;
  400. }
  401. else
  402. {
  403. lson[dad[p]] = r;
  404. }
  405. dad[p] = ARI_NIL;
  406. }
  407. void DeleteNode(int p)
  408. {
  409. int q = 0;
  410. if(dad[p] == ARI_NIL)
  411. {
  412. return ;
  413. }
  414. if(rson[p] == ARI_NIL)
  415. {
  416. q = lson[p];
  417. }
  418. else if(lson[p] == ARI_NIL)
  419. {
  420. q = rson[p];
  421. }
  422. else
  423. {
  424. q = lson[p];
  425. if(rson[q] != ARI_NIL)
  426. {
  427. do
  428. {
  429. q = rson[q];
  430. }while (rson[q] != ARI_NIL);
  431. rson[dad[q]] = lson[q];
  432. dad[lson[q]] = dad[q];
  433. lson[q] = lson[p];
  434. dad[lson[p]] = q;
  435. }
  436. rson[q] = rson[p];
  437. dad[rson[p]] = q;
  438. }
  439. dad[q] = dad[p];
  440. if(rson[dad[p]] == p)
  441. {
  442. rson[dad[p]] = q;
  443. }
  444. else
  445. {
  446. lson[dad[p]] = q;
  447. }
  448. dad[p] = ARI_NIL;
  449. }
  450. void StartModel(void)
  451. {
  452. int ch, sym, i;
  453. sym_cum[ARI_N_CHAR] = 0;
  454. for(sym = ARI_N_CHAR; sym >= 1; sym --)
  455. {
  456. ch = sym - 1;
  457. char_to_sym[ch] = sym;
  458. sym_to_char[sym] = ch;
  459. sym_freq[sym] = 1;
  460. sym_cum[sym - 1] = sym_cum[sym] + sym_freq[sym];
  461. }
  462. sym_freq[0] = 0;
  463. position_cum[ARI_N] = 0;
  464. for(i = ARI_N; i >= 1; i--)
  465. {
  466. position_cum[i - 1] = position_cum[i] + 10000 / (i + 200);
  467. }
  468. }
  469. void UpdateModel(int sym)
  470. {
  471. int i, c, ch_i, ch_sym;
  472. if(sym_cum[0] >= ARI_MAX_CUM)
  473. {
  474. c = 0;
  475. for(i = ARI_N_CHAR; i > 0; i--)
  476. {
  477. sym_cum[i] = c;
  478. c += (sym_freq[i] = (sym_freq[i] + 1) >> 1);
  479. }
  480. sym_cum[0] = c;
  481. }
  482. for(i = sym; sym_freq[i] == sym_freq[i - 1]; i--);
  483. if(i < sym)
  484. {
  485. ch_i = sym_to_char[i];
  486. ch_sym = sym_to_char[sym];
  487. sym_to_char[i] = ch_sym;
  488. sym_to_char[sym] = ch_i;
  489. char_to_sym[ch_i] = sym;
  490. char_to_sym[ch_sym] = i;
  491. }
  492. sym_freq[i]++;
  493. while(--i >= 0)
  494. {
  495. sym_cum[i] ++;
  496. }
  497. }
  498. void Output(int bit)
  499. {
  500. PutBit(bit);
  501. for( ; shifts > 0; shifts--)
  502. {
  503. PutBit(! bit);
  504. }
  505. }
  506. void EncodeChar(int ch)
  507. {
  508. int  sym;
  509. unsigned long int  range;
  510. sym = char_to_sym[ch];
  511. range = high - low;
  512. high = low + (range * sym_cum[sym - 1]) / sym_cum[0];
  513. low += (range * sym_cum[sym]) / sym_cum[0];
  514. for( ; ; )
  515. {
  516. if(high <= ARI_Q2)
  517. {
  518. Output(0);
  519. }
  520. else if(low >= ARI_Q2)
  521. {
  522. Output(1);
  523. low -= ARI_Q2;
  524. high -= ARI_Q2;
  525. }
  526. else if(low >= ARI_Q1 && high <= ARI_Q3)
  527. {
  528. shifts ++;
  529. low -= ARI_Q1;
  530. high -= ARI_Q1;
  531. }
  532. else
  533. {
  534. break;
  535. }
  536. low += low;
  537. high += high;
  538. }
  539. UpdateModel(sym);
  540. }
  541. void EncodePosition(int position)
  542. {
  543. unsigned long int range;
  544. range = high - low;
  545. high = low + (range * position_cum[position]) / position_cum[0];
  546. low += (range * position_cum[position + 1]) / position_cum[0];
  547. for( ; ; )
  548. {
  549. if (high <= ARI_Q2)
  550. {
  551. Output(0);
  552. }
  553. else if(low >= ARI_Q2)
  554. {
  555. Output(1);
  556. low -= ARI_Q2;
  557. high -= ARI_Q2;
  558. }
  559. else if(low >= ARI_Q1 && high <= ARI_Q3)
  560. {
  561. shifts++;
  562. low -= ARI_Q1;
  563. high -= ARI_Q1;
  564. }
  565. else
  566. {
  567. break;
  568. }
  569. low += low;
  570. high += high;
  571. }
  572. }
  573. void EncodeEnd(void)
  574. {
  575. shifts++;
  576. if(low < ARI_Q1)
  577. {
  578. Output(0);
  579. }
  580. else
  581. {
  582. Output(1);
  583. }
  584. FlushBitBuffer();
  585. }
  586. int BinarySearchSym(unsigned int x)
  587. {
  588. int i, j, k;
  589. i = 1;
  590. j = ARI_N_CHAR;
  591. while(i < j)
  592. {
  593. k = (i + j) / 2;
  594. if(sym_cum[k] > x)
  595. {
  596. i = k + 1;
  597. }
  598. else
  599. {
  600. j = k;
  601. }
  602. }
  603. return i;
  604. }
  605. int BinarySearchPos(unsigned int x)
  606. {
  607. int i, j, k;
  608. i = 1;  j = ARI_N;
  609. while(i < j)
  610. {
  611. k = (i + j) / 2;
  612. if(position_cum[k] > x)
  613. {
  614. i = k + 1;
  615. }
  616. else
  617. {
  618. j = k;
  619. }
  620. }
  621. return i - 1;
  622. }
  623. void StartDecode(void)
  624. {
  625. int i;
  626. for(i = 0; i < ARI_M + 2; i++)
  627. {
  628. value = 2 * value + GetBit();
  629. }
  630. }
  631. int DecodeChar(void)
  632. {
  633. int  sym, ch;
  634. unsigned long int  range;
  635. range = high - low;
  636. sym = BinarySearchSym((unsigned int)(((value - low + 1) * sym_cum[0] - 1) / range));
  637. high = low + (range * sym_cum[sym - 1]) / sym_cum[0];
  638. low += (range * sym_cum[sym]) / sym_cum[0];
  639. for( ; ; )
  640. {
  641. if(low >= ARI_Q2)
  642. {
  643. value -= ARI_Q2;
  644. low -= ARI_Q2;
  645. high -= ARI_Q2;
  646. }
  647. else if(low >= ARI_Q1 && high <= ARI_Q3)
  648. {
  649. value -= ARI_Q1;
  650. low -= ARI_Q1;
  651. high -= ARI_Q1;
  652. }
  653. else if (high > ARI_Q2)
  654. {
  655. break;
  656. }
  657. low += low;
  658. high += high;
  659. value = 2 * value + GetBit();
  660. }
  661. ch = sym_to_char[sym];
  662. UpdateModel(sym);
  663. return ch;
  664. }
  665. int DecodePosition(void)
  666. {
  667. int position;
  668. unsigned long int  range;
  669. range = high - low;
  670. position = BinarySearchPos((unsigned int)(((value - low + 1) * position_cum[0] - 1) / range));
  671. high = low + (range * position_cum[position]) / position_cum[0];
  672. low += (range * position_cum[position + 1]) / position_cum[0];
  673. for( ; ; )
  674. {
  675. if(low >= ARI_Q2)
  676. {
  677. value -= ARI_Q2;
  678. low -= ARI_Q2;
  679. high -= ARI_Q2;
  680. }
  681. else if(low >= ARI_Q1 && high <= ARI_Q3)
  682. {
  683. value -= ARI_Q1;
  684. low -= ARI_Q1;
  685. high -= ARI_Q1;
  686. }
  687. else if(high > ARI_Q2)
  688. {
  689. break;
  690. }
  691. low += low;
  692. high += high;
  693. value = 2 * value + GetBit();
  694. }
  695. return position;
  696. }
  697. protected:
  698. unsigned long int textsize;
  699. unsigned long int codesize;
  700. unsigned long int printcount;
  701. unsigned char text_buf[ARI_N + ARI_F - 1];
  702. int match_position;
  703. int match_length;
  704. int lson[ARI_N + 1];
  705. int rson[ARI_N + 257];
  706. int dad[ARI_N + 1];
  707. unsigned long int low;
  708. unsigned long int high;
  709. unsigned long int value;
  710. int shifts;
  711. int char_to_sym[ARI_N_CHAR];
  712. int sym_to_char[ARI_N_CHAR + 1];
  713. unsigned int sym_freq[ARI_N_CHAR + 1];
  714. unsigned int sym_cum[ARI_N_CHAR + 1];
  715. unsigned int position_cum[ARI_N + 1];
  716. HGLOBAL m_hData;
  717. LPBYTE  m_lpMemData;
  718. BYTE byMaxBuf[MAXSIZE];
  719. LPBYTE m_lpBuffer;
  720. int m_nTotalSize;
  721. int nCurPos; //记下数据的位置
  722. int nZipPos; //记下压缩数据的位置
  723. int nBufPos; //记下当前存储位置hZip
  724. int nZipSize; //压缩后数据的大小
  725. };
  726. ///////////////////////////////////////////////////////////////////////////////
  727. //ARI Part END--------------------------------------------------------------
  728. ///////////////////////////////////////////////////////////////////////////////
  729. ///////////////////////////////////////////////////////////////////////////////
  730. //LZW Part START--------------------------------------------------------------
  731. ///////////////////////////////////////////////////////////////////////////////
  732. typedef struct LZWEncodeEntry
  733. {
  734. BYTE bLast;
  735. WORD wCode;
  736. struct LZWEncodeEntry far *pChild,*pRightBrother;
  737. }LZWENCODEENTRY,*PLZWENCODEENTRY;     
  738. typedef struct LZWDecodeEntry
  739. {
  740. BYTE *pbContain;
  741. }LZWDECODEENTRY,*PLZWDECODEENTRY;
  742. class CLZWDecodeTable
  743. {
  744. public:
  745. CLZWDecodeTable(BOOL fInit=TRUE);
  746. ~CLZWDecodeTable();
  747. void ClearDecodeTable(void);
  748. void InitLZWTable(void);
  749. BYTE* GetMatchData(WORD wCode);
  750. void AddToChild(WORD wCode,BYTE *pbContain,int iLength);
  751. DWORD GetTableEntryNumber(void){return m_dwTableEntryNumber;};
  752. protected:
  753. BYTE** m_pbContain;
  754. DWORD m_dwTableEntryNumber;
  755. };
  756. class CLZWEncodeTable
  757. {
  758. public:
  759. CLZWEncodeTable(BOOL fInit=TRUE);
  760. ~CLZWEncodeTable();
  761. void ClearLZWTable(void);
  762. void InitLZWTable(void);
  763. PLZWENCODEENTRY FindMatchChild(BYTE bChileLast,PLZWENCODEENTRY pCurrent);
  764. // return the find child
  765. PLZWENCODEENTRY  AddToChild(BYTE bLast,PLZWENCODEENTRY pCurrent);
  766. //return the add child
  767. public://inline
  768. PLZWENCODEENTRY GetHead(void){return &m_EntryHead;};
  769. DWORD GetTableEntryNumber(void){return m_dwTableEntryNumber;};
  770. protected:
  771. void RemoveFirstChild(void);
  772. PLZWENCODEENTRY FindRightBrother(PLZWENCODEENTRY pCurrent);
  773. protected:
  774. DWORD m_dwTableEntryNumber;
  775. UINT m_uNextCodeForUse;
  776. LZWENCODEENTRY m_EntryHead;
  777. };
  778. typedef BOOL (*FUN_LZWENCODEGETNEXTBYTE) (BYTE& bGet);// get next byte
  779. typedef BOOL (*FUN_LZWENCODEPUTNEXTBYTES) (BYTE* pbPut,int iLength); // put next byte
  780. typedef void (*FUN_LZWENCODEDBYTES) (void);
  781. typedef BOOL (*FUN_LZWDECODEGETNEXTBYTES) (BYTE* pbGet,int iLength);
  782. typedef BOOL (*FUN_LZWDECODEPUTNEXTBYTE) (BYTE bPut);
  783. typedef void (*FUN_LZWDECODEDBYTES) (void);
  784. #define LZW_MAX_ENTRY              4096
  785. #define LZW_CLEAR_CODE                  256
  786. #define LZW_END_CODE                    LZW_CLEAR_CODE+1//257
  787. #define LZW_BEGIN_ENTRY                 LZW_END_CODE+1//258
  788. //#define SET_BIT_1(b,i)          (b |= (1<<i))
  789. #define SET_BIT_0(b,i)          (b &= (~(1<<i)))
  790. //#define CHECK_BIT_1(b,i)        (b & (1<<i))
  791. #define CHECK_BIT_0(b,i)        (!(CHECK_BIT_1(b,i))
  792. class CDecodeBitArray
  793. public:
  794. CDecodeBitArray(DWORD dwInitWidth=0);// width in bit
  795. ~CDecodeBitArray();
  796. void ClearBits(void);
  797. void InitBits(DWORD dwInitWidth);
  798. void InitBytes(DWORD dwInitWidth);
  799. DWORD GetLeftBytes(void);
  800. DWORD GetLeftBits(void){return m_dwTail-m_dwHead;};
  801. WORD RemoveBits(int iWidth);
  802. BOOL AddBytes(BYTE* pbAdd,int iLength);
  803. protected:
  804. void Resort(void);
  805. WORD RemoveFirstBit(void);
  806. protected:
  807. BYTE *m_pbBits;
  808. DWORD m_dwTail,m_dwHead;
  809. // tail is the first not usable bit
  810. // head is the first usable bit
  811. DWORD m_dwWidthInByte;
  812. };
  813. class CEncodeBitArray
  814. {
  815. public:
  816. CEncodeBitArray(DWORD dwInitWidth=0);// width in bit
  817. BOOL InitBits(DWORD dwInitWidth);
  818. BOOL InitBytes(DWORD dwInitWidth){return InitBits(dwInitWidth*8);};
  819. void ClearBits(void);
  820. ~CEncodeBitArray();
  821. BOOL AddBits(WORD wAdd,int iWidth);
  822. DWORD GetBytesWidth(void);// get width in byte
  823. DWORD GetBitsWidth(void){return m_dwTail;};// get width in bit
  824. BYTE* GetBits(void){return m_pbBits;};// get the point of contain
  825. DWORD GetMaxBytes(void){return m_dwWidthInByte;};// get max capability
  826. int RemoveBytes(BYTE *pbGet,int iWant);
  827. // get bytes in contain and reset tail
  828. protected:
  829. BYTE* m_pbBits;
  830. DWORD m_dwTail;
  831. DWORD m_dwWidthInByte;
  832. };
  833. class CLZWDecode
  834. public:
  835. CLZWDecode():m_LZWTable(FALSE)
  836. {
  837. iDeGetPos = 0;
  838. iDePutPos = 0;
  839. };
  840. ~CLZWDecode(){};
  841. HGLOBAL BeginLZWDecode(char *chZipData, int dwLength);
  842. protected:
  843. CLZWDecodeTable m_LZWTable;
  844. CDecodeBitArray m_baContain;
  845. DWORD m_dwDecodedByte;
  846. int m_iTotalEntry;
  847. int iDeGetPos;
  848. int iDePutPos;
  849. };
  850. class CLZWEncode
  851. {
  852. public:
  853. CLZWEncode():m_LZWTable(FALSE)
  854. {
  855. m_wMaxEntry = LZW_MAX_ENTRY;
  856. iPut = 0;
  857. iTurn = 0;
  858. };
  859. ~CLZWEncode(){};
  860. HGLOBAL BeginLZWEncode(char *chData, int dwLength);
  861. DWORD GetCompressedLength(void){return m_dwCompressedLength;};
  862. protected:
  863. int GetBitWidth(void);
  864. protected:
  865. WORD m_wMaxEntry;
  866. CLZWEncodeTable m_LZWTable;
  867. CEncodeBitArray m_baContain;
  868. DWORD m_dwCompressedLength;
  869. int iPut;
  870. int iTurn;
  871. };
  872. class C_LZW
  873. {
  874. public:
  875. C_LZW()
  876. {
  877. }
  878. ~C_LZW()
  879. {
  880. }
  881. HGLOBAL Encode(char *chData, int nSize);
  882. HGLOBAL Decode(char *chZipData, int nZipSize);
  883. protected:
  884. };
  885. ///////////////////////////////////////////////////////////////////////////////
  886. //LZW Part END--------------------------------------------------------------
  887. ///////////////////////////////////////////////////////////////////////////////
  888. #endif //