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

📄 lzwcode.h

📁 用VC++实现LZW算法
💻 H
字号:
#ifndef __SELFLZW_H
#define __SELFLZW_H

#include "lzwtable.h"

// define for lzw encode
typedef BOOL (*FUN_LZWENCODEGETNEXTBYTE) (BYTE& bGet);// get next byte
typedef BOOL (*FUN_LZWENCODEPUTNEXTBYTES) (BYTE* pbPut,int iLength); // put next byte
typedef void (*FUN_LZWENCODEDBYTES) (void);
typedef BOOL (*FUN_LZWDECODEGETNEXTBYTES) (BYTE* pbGet,int iLength);
typedef BOOL (*FUN_LZWDECODEPUTNEXTBYTE) (BYTE bPut);
typedef void (*FUN_LZWDECODEDBYTES) (void);

#define LZW_MAX_ENTRY             		4096
#define LZW_CLEAR_CODE                  256
#define LZW_END_CODE                    LZW_CLEAR_CODE+1//257
#define LZW_BEGIN_ENTRY                 LZW_END_CODE+1//258

#define SET_BIT_1(b,i)          (b |= (1<<i))
#define SET_BIT_0(b,i)          (b &= (~(1<<i)))
#define CHECK_BIT_1(b,i)        (b & (1<<i))
#define CHECK_BIT_0(b,i)        (!(CHECK_BIT_1(b,i))

class CDecodeBitArray
{ 
public:
	CDecodeBitArray(DWORD dwInitWidth=0);// width in bit
	~CDecodeBitArray();
	void ClearBits(void);
	void InitBits(DWORD dwInitWidth);
	void InitBytes(DWORD dwInitWidth);
	DWORD GetLeftBytes(void);
	DWORD GetLeftBits(void){return m_dwTail-m_dwHead;};
	WORD RemoveBits(int iWidth);
	BOOL AddBytes(BYTE* pbAdd,int iLength);
protected:
	void Resort(void);
	WORD RemoveFirstBit(void);
protected:
	BYTE *m_pbBits;
	DWORD m_dwTail,m_dwHead;
	// tail is the first not usable bit
	// head is the first usable bit
	DWORD m_dwWidthInByte;
};

class CEncodeBitArray
{
public:
	CEncodeBitArray(DWORD dwInitWidth=0);// width in bit
	BOOL InitBits(DWORD dwInitWidth);
	BOOL InitBytes(DWORD dwInitWidth){return InitBits(dwInitWidth*8);};
	void ClearBits(void);
	~CEncodeBitArray();
	BOOL AddBits(WORD wAdd,int iWidth);
	DWORD GetBytesWidth(void);// get width in byte
	DWORD GetBitsWidth(void){return m_dwTail;};// get width in bit
	BYTE* GetBits(void){return m_pbBits;};// get the point of contain
	DWORD GetMaxBytes(void){return m_dwWidthInByte;};// get max capability
	int RemoveBytes(BYTE *pbGet,int iWant);
	// get bytes in contain and reset tail
protected:
	BYTE* m_pbBits;
	DWORD m_dwTail;
	DWORD m_dwWidthInByte;
};
class CLZWDecode
{ 
public:
	CLZWDecode():m_LZWTable(FALSE)
	{};
	~CLZWDecode(){};
	BOOL BeginLZWDecode(const DWORD dwLength,
						FUN_LZWDECODEGETNEXTBYTES pfunLZWGetNextBytes,
						FUN_LZWDECODEPUTNEXTBYTE pfunLZWPutNextByte,
						WORD wBuffer=1024,
						FUN_LZWDECODEDBYTES pfunLZWDecodedBytes=NULL,
						DWORD dwBytesOnce=1);
	void EndLZWDecode(FUN_LZWDECODEPUTNEXTBYTE pfunLZWPutNextByte);
protected:
	void WriteDecode(BYTE* pbWrite,
					FUN_LZWDECODEPUTNEXTBYTE pfunLZWPutNextByte,
					FUN_LZWDECODEDBYTES pfunLZWDecodedBytes=NULL,
					DWORD dwBytesOnce=1);
protected:
	CLZWDecodeTable m_LZWTable;
	CDecodeBitArray m_baContain;
	DWORD m_dwDecodedByte;
	int m_iTotalEntry;
};

class CLZWEncode
{
public:
	CLZWEncode():m_LZWTable(FALSE)
		{m_wMaxEntry=LZW_MAX_ENTRY;};
	~CLZWEncode(){};
	BOOL BeginLZWEncode(const DWORD dwLength,
						FUN_LZWENCODEGETNEXTBYTE pfunLZWGetNextByte,
						FUN_LZWENCODEPUTNEXTBYTES pfunLZWPutNextBytes,
						WORD wBufferLen=1024,
						FUN_LZWENCODEDBYTES pfunLZWEncodedBytes=NULL,
						DWORD dwBytesOnce=1);
	void EndLZWEncode(FUN_LZWENCODEPUTNEXTBYTES pfunLZWPutNextBytes);
	DWORD GetCompressedLength(void){return m_dwCompressedLength;};
protected:
	int GetBitWidth(void);
protected:
	WORD m_wMaxEntry;
	CLZWEncodeTable m_LZWTable;
	CEncodeBitArray m_baContain;
	DWORD m_dwCompressedLength;
};

#endif

⌨️ 快捷键说明

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