📄 crctable.cpp
字号:
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 + -