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

📄 crctable.cpp

📁 用几种不同的方法来实现CRC算法.可以带初值
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			for(int i=0;i<16;i++)
			{
				if(!(i%4))
				{
					TRACE("\nYM CRC%2d:%02X - 0x%08X,",m_bits,i,m_crcTable[1][i]);
				}
				else
				{
					TRACE(" 0x%08X,",m_crcTable[1][i]);
				}
			}
			
		}	
		TRACE("\n");
	}
	else
	{
		CString str1;
		str1=("\r\n---------16 Table Lo-----------");
		*str+=str1;
		{
			for(int i=0;i<16;i++)
			{
				if(!(i%4))
				{
					str1.Format("\r\nYM CRC%2d:%02X - 0x%08X,",m_bits,i,m_crcTable[0][i]);
				}
				else
				{
					str1.Format(" 0x%08X,",m_crcTable[0][i]);
				}
				*str+=str1;
			}
			
		}
		str1=("\r\n---------16 Table Hi-----------");
				*str+=str1;
		{
			for(int i=0;i<16;i++)
			{
				if(!(i%4))
				{
					str1.Format("\r\nYM CRC%2d:%02X - 0x%08X,",m_bits,i,m_crcTable[1][i]);
				}
				else
				{
					str1.Format(" 0x%08X,",m_crcTable[1][i]);
				}
				*str+=str1;
			}
			
		}	
		str1=("\r\n");
		*str+=str1;
	}
}

#ifdef _YM_COMMENT_
// 以下内容仅作类信息浏览使用,没有实际意义
U32 CRC32tableLo[] = { 
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
};

U32 CRC32tableHi[] = { 
	0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
	0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
	0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
	0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c,
};
#endif // _YM_COMMENT_
//
//CRC32 :X32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + x0
//0xedb88320: 1110 1101, 1011 1000, 1000 0011, 0010 0000
VOID CCRCTable16::CreateCRC32Table()
{
	U32 bits=32-1;// 31=32-1表示右移一位
	U32 Gx=//(1<<(bits-32))+ // 这一位相当于已经移出
		(1<<(bits-26))+
		(1<<(bits-23))+
		(1<<(bits-22))+
		(1<<(bits-16))+
		(1<<(bits-12))+
		(1<<(bits-11))+
		(1<<(bits-10))+
		(1<<(bits- 8))+
		(1<<(bits- 7))+
		(1<<(bits- 5))+
		(1<<(bits- 4))+
		(1<<(bits- 2))+
		(1<<(bits- 1))+
		(1<<(bits- 0)); // CRC Poly (CRC多项式)
	CreateCRCTable(Gx,bits+1);
}

#ifdef _YM_COMMENT_
// 以下内容仅作类信息浏览使用,没有实际意义
U32 CRC16tableLo[] = { 
	0x00000000, 0x0000c0c1, 0x0000c181, 0x00000140,
	0x0000c301, 0x000003c0, 0x00000280, 0x0000c241,
	0x0000c601, 0x000006c0, 0x00000780, 0x0000c741,
	0x00000500, 0x0000c5c1, 0x0000c481, 0x00000440,
};

U32 CRC16tableHi[] = { 
	0x00000000, 0x0000cc01, 0x0000d801, 0x00001400,
	0x0000f001, 0x00003c00, 0x00002800, 0x0000e401,
	0x0000a001, 0x00006c00, 0x00007800, 0x0000b401,
	0x00005000, 0x00009c01, 0x00008801, 0x00004400,
};
//
#endif // _YM_COMMENT_
//CRC32 : x16 + x15 + x2 + x0
VOID CCRCTable16::CreateCRC16Table()
{
	U32 bits=16-1;// 31=32-1表示右移一位
	U32 Gx=//(1<<(bits-16))+// 这一位相当于已经移出
		(1<<(bits-15))+
		(1<<(bits-2 ))+
		(1<<(bits-0 ));
	CreateCRCTable(Gx,bits+1);
}

VOID CCRCTable16::CreateCRC_CCITT_Table()
{
	U32 bits=16-1;// 31=32-1表示右移一位
	U32 Gx=//(1<<(bits-16))+// 这一位相当于已经移出
		(1<<(bits-12))+
		(1<<(bits-5))+
		(1<<(bits-0));
	CreateCRCTable(Gx,bits+1);
}

U32 CCRCTable16::CRC(BYTE *k, U32 l, U32 c)
{
	if(m_bits!=32)
		c&=((1<<m_bits)-1);
	while(l-->0){ 
		c = (c >>8)^m_CRCTable256((U08)(c^*k++ )); 
	} 
	return c;
}

/////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// CCRCBit Class
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

U32 CCRCBit::CRC(BOOL k, U32 c)
{
	//if(m_bits!=32)	c&=((1<<m_bits)-1);
	c^=k;				// 
	if(c&1)
	{
		c>>=1;
		c^=m_crcPoly;
	}
	else c>>=1;
	return c;
}

U32 CCRCBit::CRC(BYTE* k, U32 c)
{
	for(int i=0;i<8;i++)
	{
		c=CRC((*k>>i)&1,c);
	}
	return c;
}

U32 CCRCBit::CRC(BYTE *k, U32 l, U32 c)
{
	if(m_bits!=32)
		c&=((1<<m_bits)-1);
	while(l-->0) c = CRC(k++,c); 
	return c;
}

VOID CCRCBit::CreateCRC_CCITT_Table()
{
	U32 bits=16-1;// 31=32-1表示右移一位
	U32 Gx=//(1<<(bits-16))+// 这一位相当于已经移出
		(1<<(bits-12))+
		(1<<(bits-5))+
		(1<<(bits-0));
	m_bits=bits+1;
	m_crcPoly=Gx;
}

//////////////////////////////////////////////////////////////////////
// CCRCArray Class
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
VOID CCRCArray::CRC(BOOL k, U32 *c)
{
	c[0]^=k;
	U32 c0=c[0];
/*///BEG_RENEW
//{ 2008-07-28 08:34:56
	if(c0)
	{
		for(int i=0;i<m_bits-1;i++)
		{
			c[i]=(c[i+1]^(G[i]*c0)); // c=c[i+1]^G[i]; //c=(c>>1)^G
			// if(G[i]) c[i]=c[i+1]^1=c[i+1]^c0 else c[i]=c[i+1]^0=c[i+1];
		}
		c[i]=0^(G[i]*c0); // c=0^G[i]=0^G=G
		// if(G[i]) c[i]=1=c0 else c[i]=0;
	}
	else
	{
		for(int i=0;i<m_bits-1;i++)
		{
			c[i]=(c[i+1]^(G[i]*c0)); // c[i]=c[i+1]^0=c[i+1]; // c=(c>>1)
			// if(G[i]) c[i]=c[i+1]^0=c[i+1]^c0 else c[i]=c[i+1];
		}
		c[i]=0^(G[i]*c0); // c=0^0=0^c0=c0;
		// if(G[i]) c[i]=0=c0 else c[i]=0;
		}
/*/
//} 2008-07-28 08:34:56
//*///END_RENEW
	for(int i=0;i<m_bits-1;i++)
	{
		if(G[i])c[i]=c[i+1]^c0;
		else c[i]=c[i+1];
	}
	if(G[i]) c[i]=c0;		// c[i]=0^G[i]=1=c0; //
	else     c[i]=0;		// c[i]=0^G[i]=0=c0; //
}

// 硬件实现框图
//
// k────────────────→──────────┐
//                                                        │
//  ┌←────┬←────┬←────┬←─────┐  │
//  │          │          │          │            │  │
//  │          ↓          ↓          ↓            │  │ 
// X0=1         X1         ...         Xn-1           │ Xn=1
// Gn=1        Gn-1         G2          G1          c0│ G0=1
//  │          ↓          ↓          ↓            │  │ 
//  └→[c3]─→⊕→[c2]─→⊕→[c1]─→⊕→[c0]┬─→⊕←┘
//                                              ↓
//                                              └───→ CRC
//
// 图中,若X[i]==0,表示此路断开,此时没有异或⊕;否则导通,进行异或。
// 正常为:Gx=X4+X2+X1+X0,传送时由于低位在前,故为Gx=G(4-1)+G(4-2)+G(4-1)+G(4-0)=G0+G2+G3+G4
// 示意图如下:
// k────────────────→───────────┐
//                                                          │
//                                                     0    │
//                                             无数据↙     │
//  ┌←────┬←────┬←─────←────┤      │
//  │          │          │          ┆     有数据↖     │
//  │          │          │          ┆            │    │
//  │          │          │          ┆            │    │ 
//  │G4=1      │G3=1      │G2=1      ┆G1=0      c0│    │G0=1
//  │          ↓          ↓                        │    │ 
//  └→[c3]─→⊕→[c2]─→⊕→[c1]───→[c0]┬─→⊕←─┤
//                                              ↓     有数据↘
//                                              ▽            ├──→输出数据
//                                              ○CRC  无数据↗
//                                              └──→──┘ 
//
//*//BEG_RENEW
//{ 2008-07-28 10:59:52
// 1. c[3]=c[2]=c[1]=c[0]=0/1;c0=0;
// 2. 
//    c0   = c[0]^k
//    c[0] = c[1]^(G1*c0) = c[1]
//    c[1] = c[2]^(G2*c0) = c[2]^c0
//    c[2] = c[3]^(G3*c0) = c[3]^c0
//    c[3] =    0^(G4*c0) =      c0
/*/
//} 2008-07-28 10:59:52
//*///END_RENEW

VOID CCRCArray::CreateCRC_CCITT_Table()
{
	memset(this,0,sizeof(*this));
	//G[15-16]=1;
	G[15-12]=1;
	G[15- 5]=1;
	G[15- 0]=1;
	m_bits=16;
}

U32 CCRCArray::CRC(BYTE *k, U32 l, U32 c)
{
	U32 r[32];
	memset(r,0,sizeof(r));
	for(int i=0;i<m_bits;i++)
	{
		r[i]=((c>>i)&1);
	}
	for(;l-->0;k++)
		for( i=0;i<8;i++)
		{
			CRC((*k>>i)&1,r);
		}
	c=0;
	for( i=0;i<m_bits;i++)
	{
		c|=(r[i]<<i);
	}
	return c;
}

///////////////////////
//

⌨️ 快捷键说明

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