⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compressedfile.h

📁 < VC++编程宝典> 编程必备,适合初学者!
💻 H
字号:
// CompressedFile.h

#include "stdafx.h"

#define BUFFERSIZE 32000

// File format for compressed files is 8 bytes of signature/identifier.
// DWORD size of uncompressed file.
// DWORD size of compressed file.

#define NUMBER_OF_SIGNATURES 3
#define SIGNATURE_LENGTH 8

static char *szSignatures[] = {
"**++HUFF",
"**++LZSS",
"**++LZW "
};

#define HUFF 0
#define LZSS 1
#define LZW 2
#define UNCOMP -1

#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE !FALSE
#endif

// Huffman defines and structures follow...

#define ESCAPE 257
#define SYMBOL_COUNT 258
#define NODE_TABLE_COUNT ( ( SYMBOL_COUNT * 2 ) - 1 )
#define ROOT_NODE 0
#define MAX_WEIGHT 0x8000

#pragma pack(1)
typedef struct node{
	unsigned int nWeight;
	int nParent;
	int nChildIsLeaf;
	int nChild;
	} NODE;
	
typedef struct tree{
	int nLeaf[SYMBOL_COUNT];
	int nNextFreeNode;
	struct node nodes[NODE_TABLE_COUNT];
	} TREE;


// LZSS Defines and Stucts

#define INDEX_BIT_COUNT 12
#define LENGTH_BIT_COUNT 4
#define WINDOW_SIZE ( 1 << INDEX_BIT_COUNT )
#define RAW_LOOK_AHEAD_SIZE ( 1 << LENGTH_BIT_COUNT )
#define BREAK_EVEN ( ( 1 + INDEX_BIT_COUNT + LENGTH_BIT_COUNT ) / 9 )
#define LOOK_AHEAD_SIZE ( RAW_LOOK_AHEAD_SIZE + BREAK_EVEN )
#define TREE_ROOT WINDOW_SIZE
#define MOD_WINDOW( a ) ( ( a ) & ( WINDOW_SIZE - 1 ) )

typedef struct{
	int nParent;
	int nSmallerChild;
	int nLargerChild;
	} LZSS_TREE;


// LZW Defines and structs

#define BITS 15
#define MAX_CODE 0x7fff
#define TABLE_SIZE 35023L
#define TABLE_BANKS ( ( TABLE_SIZE >> 8 ) + 1 )
#define BUMP_CODE 257
#define FLUSH_CODE 258
#define FIRST_CODE 259

typedef struct{
	int nCodeValue;
	int nParentCode;
	char nCharacter;
	} DICTIONARY;

#define DICT( i ) m_Dict[i>>8][i&0x00ff]

#pragma pack()

class CCompressedFile : public CFile
{

public:
	CCompressedFile( int nType = LZW );
	~CCompressedFile();

	virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );
	virtual void Close( void );
	DWORD GetPosition( void );
	
	virtual unsigned int Read( void far *, unsigned int );
	virtual void Write( void far *, unsigned int );

	DWORD GetLength( void );
	BOOL FindFileInArchive( int );
	static int FileType( char * );
	static CCompressedFile *MakeNewFile( char *, int Typ = LZW );

	unsigned int ReadBytes( void far *, unsigned int );
	int ReadByte( void );
	void WriteBytes( void far *, unsigned int );
	void WriteByte( int );

	void OutputBit( int );
	void OutputBits( DWORD, int );
	int InputBit( void );
	DWORD InputBits( int );

	unsigned char *m_pBuffer;
	DWORD m_dwFilePointer;
	DWORD m_dwBytesInBuffer;
	DWORD m_dwBufferPointer;
	DWORD m_dwFileLength;
	BOOL m_bOpened;
	BOOL m_bCanRead;
	BOOL m_bCanWrite;
	int m_nCompressionType;

	int m_nRack, m_nPacifierCount, m_nMask;
	unsigned char m_ucBit;

	DWORD m_dwSeekTo;
	char m_szFilename[130];
	DWORD m_dwCompressedSize, m_dwUncompressedSize;
	unsigned int m_nFlags;

	void SetSizeToFileLength( void );

};

class CHuffmanFile : public CCompressedFile
{

public:
	virtual unsigned int Read( void far *, unsigned int );
	virtual void Write( void far *, unsigned int );

	virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );
	virtual void Close( void );
	
private:
	void UpdateModel( int );
	void EncodeSymbol( unsigned int );
	void AddNewNode( int );
	int DecodeSymbol( void );
	void InitializeTree( void );
	void RebuildTree( void );
	void SwapNodes( int, int );

	TREE Tree;

};

class CLzssFile : public CCompressedFile
{

public:
	virtual unsigned int Read( void far *, unsigned int );
	virtual void Write( void far *, unsigned int );

	virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );
	virtual void Close( void );

	void EncodeSymbols( unsigned char *, BOOL EndFlag = FALSE );
	void InitializeTree( void );
	void ContractNode( int, int );
	void ReplaceNode( int, int );
	int FindNextNode( int );
	void DeleteString( int );
	int AddString( int, int * );

	BOOL m_bInitialized;
	int m_nCurrentPosition;
	int m_nLookAheadBytes;
	int m_nReplaceCount;
	int m_nMatchLength;
	int m_nMatchPosition;
	DWORD m_dwBytesToEncode;
	int m_nStoreLookAhead;
	DWORD m_dwPointer;
	DWORD m_dwExtra;
	DWORD m_dwExtraPointer;
	unsigned char *m_pExtraBuffer;

	unsigned char ucWindow[WINDOW_SIZE];
	LZSS_TREE Tree[WINDOW_SIZE+1];

};

class CLzwFile : public CCompressedFile
{

public:
	CLzwFile();
	~CLzwFile();

	virtual unsigned int Read( void far *, unsigned int );
	virtual void Write( void far *, unsigned int );

	virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );
	virtual void Close( void );

	void InitializeDictionary( void );
	void AllocateStorage( void );
	void DeleteStorage( void );
	unsigned int FindChildNode( int, int );
	unsigned int DecodeString( unsigned int, unsigned int );

	DICTIONARY *m_Dict[TABLE_BANKS];
	char m_cbDecodeStack[TABLE_SIZE];
	unsigned int m_nNextCode;
	int m_nCurrentCodeBits;
	unsigned int m_nNextBumpCode;
	BOOL m_bStorageAllocated;
	BOOL m_bStarted;
	int m_nCharacter, m_nStringCode, m_nIndex;
	int m_nNewCode, m_nOldCode;
	unsigned int m_nCount;
	int m_nEntryPoint;

}; 

class CUncompressedFile : public CCompressedFile
{

public:
	virtual BOOL Open( const char *, unsigned int, CFileException *pError = NULL );

	virtual unsigned int Read( void far *, unsigned int );
	virtual void Write( void far *, unsigned int );

};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -