📄 lzwcode.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 + -