CompressedFile.h
上传用户:deer201011
上传日期:2022-06-24
资源大小:10k
文件大小:5k
源码类别:

压缩解压

开发平台:

Visual C++

  1. // CompressedFile.h
  2. #include "stdafx.h"
  3. #define BUFFERSIZE 32000
  4. // File format for compressed files is 8 bytes of signature/identifier.
  5. // DWORD size of uncompressed file.
  6. // DWORD size of compressed file.
  7. #define NUMBER_OF_SIGNATURES 3
  8. #define SIGNATURE_LENGTH 8
  9. static char *szSignatures[] = {
  10. "**++HUFF",
  11. "**++LZSS",
  12. "**++LZW "
  13. };
  14. #define HUFF 0
  15. #define LZSS 1
  16. #define LZW 2
  17. #define UNCOMP -1
  18. #ifndef FALSE
  19. #define FALSE 0
  20. #endif
  21. #ifndef TRUE
  22. #define TRUE !FALSE
  23. #endif
  24. // Huffman defines and structures follow...
  25. #define ESCAPE 257
  26. #define SYMBOL_COUNT 258
  27. #define NODE_TABLE_COUNT ( ( SYMBOL_COUNT * 2 ) - 1 )
  28. #define ROOT_NODE 0
  29. #define MAX_WEIGHT 0x8000
  30. #pragma pack(1)
  31. typedef struct node{
  32. unsigned int nWeight;
  33. int nParent;
  34. int nChildIsLeaf;
  35. int nChild;
  36. } NODE;
  37. typedef struct tree{
  38. int nLeaf[SYMBOL_COUNT];
  39. int nNextFreeNode;
  40. struct node nodes[NODE_TABLE_COUNT];
  41. } TREE;
  42. // LZSS Defines and Stucts
  43. #define INDEX_BIT_COUNT 12
  44. #define LENGTH_BIT_COUNT 4
  45. #define WINDOW_SIZE ( 1 << INDEX_BIT_COUNT )
  46. #define RAW_LOOK_AHEAD_SIZE ( 1 << LENGTH_BIT_COUNT )
  47. #define BREAK_EVEN ( ( 1 + INDEX_BIT_COUNT + LENGTH_BIT_COUNT ) / 9 )
  48. #define LOOK_AHEAD_SIZE ( RAW_LOOK_AHEAD_SIZE + BREAK_EVEN )
  49. #define TREE_ROOT WINDOW_SIZE
  50. #define MOD_WINDOW( a ) ( ( a ) & ( WINDOW_SIZE - 1 ) )
  51. typedef struct{
  52. int nParent;
  53. int nSmallerChild;
  54. int nLargerChild;
  55. } LZSS_TREE;
  56. // LZW Defines and structs
  57. #define BITS 15
  58. #define MAX_CODE 0x7fff
  59. #define TABLE_SIZE 35023L
  60. #define TABLE_BANKS ( ( TABLE_SIZE >> 8 ) + 1 )
  61. #define BUMP_CODE 257
  62. #define FLUSH_CODE 258
  63. #define FIRST_CODE 259
  64. typedef struct{
  65. int nCodeValue;
  66. int nParentCode;
  67. char nCharacter;
  68. } DICTIONARY;
  69. #define DICT( i ) m_Dict[i>>8][i&0x00ff]
  70. #pragma pack()
  71. class CCompressedFile : public CFile
  72. {
  73. public:
  74. CCompressedFile( int nType = LZW );
  75. ~CCompressedFile();
  76. virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );
  77. virtual void Close( void );
  78. DWORD GetPosition( void );
  79. virtual unsigned int Read( void far *, unsigned int );
  80. virtual void Write( void far *, unsigned int );
  81. DWORD GetLength( void );
  82. BOOL FindFileInArchive( int );
  83. static int FileType( char * );
  84. static CCompressedFile *MakeNewFile( char *, int Typ = LZW );
  85. unsigned int ReadBytes( void far *, unsigned int );
  86. int ReadByte( void );
  87. void WriteBytes( void far *, unsigned int );
  88. void WriteByte( int );
  89. void OutputBit( int );
  90. void OutputBits( DWORD, int );
  91. int InputBit( void );
  92. DWORD InputBits( int );
  93. unsigned char *m_pBuffer;
  94. DWORD m_dwFilePointer;
  95. DWORD m_dwBytesInBuffer;
  96. DWORD m_dwBufferPointer;
  97. DWORD m_dwFileLength;
  98. BOOL m_bOpened;
  99. BOOL m_bCanRead;
  100. BOOL m_bCanWrite;
  101. int m_nCompressionType;
  102. int m_nRack, m_nPacifierCount, m_nMask;
  103. unsigned char m_ucBit;
  104. DWORD m_dwSeekTo;
  105. char m_szFilename[130];
  106. DWORD m_dwCompressedSize, m_dwUncompressedSize;
  107. unsigned int m_nFlags;
  108. void SetSizeToFileLength( void );
  109. };
  110. class CHuffmanFile : public CCompressedFile
  111. {
  112. public:
  113. virtual unsigned int Read( void far *, unsigned int );
  114. virtual void Write( void far *, unsigned int );
  115. virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );
  116. virtual void Close( void );
  117. private:
  118. void UpdateModel( int );
  119. void EncodeSymbol( unsigned int );
  120. void AddNewNode( int );
  121. int DecodeSymbol( void );
  122. void InitializeTree( void );
  123. void RebuildTree( void );
  124. void SwapNodes( int, int );
  125. TREE Tree;
  126. };
  127. class CLzssFile : public CCompressedFile
  128. {
  129. public:
  130. virtual unsigned int Read( void far *, unsigned int );
  131. virtual void Write( void far *, unsigned int );
  132. virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );
  133. virtual void Close( void );
  134. void EncodeSymbols( unsigned char *, BOOL EndFlag = FALSE );
  135. void InitializeTree( void );
  136. void ContractNode( int, int );
  137. void ReplaceNode( int, int );
  138. int FindNextNode( int );
  139. void DeleteString( int );
  140. int AddString( int, int * );
  141. BOOL m_bInitialized;
  142. int m_nCurrentPosition;
  143. int m_nLookAheadBytes;
  144. int m_nReplaceCount;
  145. int m_nMatchLength;
  146. int m_nMatchPosition;
  147. DWORD m_dwBytesToEncode;
  148. int m_nStoreLookAhead;
  149. DWORD m_dwPointer;
  150. DWORD m_dwExtra;
  151. DWORD m_dwExtraPointer;
  152. unsigned char *m_pExtraBuffer;
  153. unsigned char ucWindow[WINDOW_SIZE];
  154. LZSS_TREE Tree[WINDOW_SIZE+1];
  155. };
  156. class CLzwFile : public CCompressedFile
  157. {
  158. public:
  159. CLzwFile();
  160. ~CLzwFile();
  161. virtual unsigned int Read( void far *, unsigned int );
  162. virtual void Write( void far *, unsigned int );
  163. virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );
  164. virtual void Close( void );
  165. void InitializeDictionary( void );
  166. void AllocateStorage( void );
  167. void DeleteStorage( void );
  168. unsigned int FindChildNode( int, int );
  169. unsigned int DecodeString( unsigned int, unsigned int );
  170. DICTIONARY *m_Dict[TABLE_BANKS];
  171. char m_cbDecodeStack[TABLE_SIZE];
  172. unsigned int m_nNextCode;
  173. int m_nCurrentCodeBits;
  174. unsigned int m_nNextBumpCode;
  175. BOOL m_bStorageAllocated;
  176. BOOL m_bStarted;
  177. int m_nCharacter, m_nStringCode, m_nIndex;
  178. int m_nNewCode, m_nOldCode;
  179. unsigned int m_nCount;
  180. int m_nEntryPoint;
  181. }; 
  182. class CUncompressedFile : public CCompressedFile
  183. {
  184. public:
  185. virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );
  186. virtual unsigned int Read( void far *, unsigned int );
  187. virtual void Write( void far *, unsigned int );
  188. };