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

📄 crctable.h

📁 用几种不同的方法来实现CRC算法.可以带初值
💻 H
字号:
// CRCTable.h: interface for the CCRCTable256 class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_CRCTABLE_H__18839AA5_D898_4569_9321_7F83BE808A43__INCLUDED_)
#define AFX_CRCTABLE_H__18839AA5_D898_4569_9321_7F83BE808A43__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


// 注意CRC码以下几种情况:
//     1. CRC码的初值:可能为0或-1
//     2. CRC码的输出:可能为本身或反码
//     3. 传送数据情况:一般在数据传递时,是先传送低字节的最低位,
//        最后传送最高字节的最高位,然后是CRC码
class CCRCTable256  
{
public:
	U32 m_bits;			// 多项式位数
	U32 m_crcPoly;		// CRC多项式,省略了最高位1
						// 实际CRC多项式为(crcPoly<<1)+1
	U32 m_crcTable[256];// CRC表
public:
	CCRCTable256(){memset(this,0,sizeof(*this));};
	CCRCTable256(U32 crcPoly,U32 bits){
		memset(this,0,sizeof(*this));
		CreateCRCTable(crcPoly,bits);
	};
	CCRCTable256(BOOL* crcPoly,S32 count=33){
		memset(this,0,sizeof(*this));
		CreateCRCTable(crcPoly,count);
	};
	~CCRCTable256(){};
public:
	VOID ShowCRCTable(CString* str=NULL);
	VOID CreateCRC_CCITT_Table();
	VOID CreateCRC16Table();
	VOID CreateCRC32Table();
	VOID CreateCRCTable(U32 crcPoly,U32 bits);		// 创建CRC表
	VOID CreateCRCTable(BOOL* crcPoly,S32 count=33);// 创建CRC表
	U32 CRC(BYTE* k,U32 l,U32 c=0);		// CRC校验
};

//
// (crc16.m_crcTable[1][i]^crc16.m_crcTable[0][j]) == crc256.m_crcTable[(i<<4)+j]

class CCRCTable16  
{
public:
	U32 m_bits;			// 多项式位数
	U32 m_crcPoly;		// CRC多项式,省略了最高位1
						// 实际CRC多项式为(crcPoly<<1)+1
	U32 m_crcTable[2][16];// CRC表
public:
	CCRCTable16(){memset(this,0,sizeof(*this));};
	CCRCTable16(U32 crcPoly,U32 bits){
		memset(this,0,sizeof(*this));
		CreateCRCTable(crcPoly,bits);
	};
	CCRCTable16(BOOL* crcPoly,S32 count=33){
		memset(this,0,sizeof(*this));
		CreateCRCTable(crcPoly,count);
	};
	~CCRCTable16(){};
public:
	VOID CreateCRC_CCITT_Table();
	VOID CreateCRC16Table();
	VOID CreateCRC32Table();
	VOID ShowCRCTable(CString* str=NULL);
	VOID CreateCRCTable(U32 crcPoly,U32 bits);
	VOID CreateCRCTable(BOOL* crcPoly,S32 count=33);// 创建CRC表
	U32 CRC(BYTE* k,U32 l,U32 c=0);		// CRC校验
	VOID CreateCRCTable256(CCRCTable256&crcTable256)
	{
		crcTable256.m_bits    = m_bits;
		crcTable256.m_crcPoly = m_crcPoly;
		for(int h=0;h<16;h++)
			for(int l=0;l<16;l++)
				crcTable256.m_crcTable[(h<<4)+l]=(m_crcTable[1][h]^m_crcTable[0][l]);
	};
	U32 m_CRCTable256(BYTE Kx)
	{
		return m_crcTable[0][Kx&0x0f]^m_crcTable[1][Kx>>4];
	}
};

VOID YM_SY();

class CCRCBit  
{
public:
	U32 m_bits;			// 多项式位数
	U32 m_crcPoly;		// CRC多项式,省略了最高位1
						// 实际CRC多项式为(crcPoly<<1)+1
public:
	VOID CreateCRC_CCITT_Table();
	CCRCBit(U32 crcPoly,U32 bits)
	:m_bits(bits),m_crcPoly(crcPoly)
	{
	};
	CCRCBit(){CreateCRC_CCITT_Table();};
	~CCRCBit(){};
public:
	U32 CRC(BYTE *k, U32 l, U32 c);
	U32 CRC(BYTE* k, U32 c);
	U32 CRC(BOOL k,U32 c=0);	// k=[0,1] CRC校验
};


class CCRCArray  
{
public:
	U32 m_bits;		// 多项式位数
	BOOL G[33];		// CRC多项式,省略了最高位1
public:
	U32 CRC(BYTE *k, U32 l, U32 c);
	VOID CreateCRC_CCITT_Table();
	VOID CRC(BOOL k,U32* c);
	CCRCArray(BOOL k[33],U32 bits)
		:m_bits(bits)
	{
		memset(this,0,sizeof(*this));
		if(bits&&(bits<=32))
		{
			m_bits=bits;
			memcpy(G,k,m_bits);
		}
	};
	CCRCArray(){memset(this,0,sizeof(*this));};
	~CCRCArray(){};

};

#endif // !defined(AFX_CRCTABLE_H__18839AA5_D898_4569_9321_7F83BE808A43__INCLUDED_)

⌨️ 快捷键说明

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