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