📄 crctable.cpp
字号:
// CRCTable.cpp: implementation of the CCRCTable256 class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "YMType.h"
#include "CRCTable.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// CCRCTable256 Class
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
VOID CCRCTable256::CreateCRCTable(BOOL* crcPoly,S32 count)
{
U32 Gx = 0;
U32 bits = 0;
while(--count>=0)
{
if(crcPoly[count])
{
bits=count;
break;
}
}
while(count>0)
{
Gx<<=1;
if(crcPoly[bits-count--])Gx+=1;
}
if(bits)
CreateCRCTable(Gx,bits);
}
VOID CCRCTable256::CreateCRCTable(U32 crcPoly,U32 bits)
{
m_bits = bits;
m_crcPoly = crcPoly;
U32 Gx = crcPoly;
for(U32 Kx=0;Kx<256;Kx++)
{
U32 rKx=Kx;// 由于CRC码为16位(或多项式为17位),故X^r*Kx为24位
for(int i=0;i<8;i++)
{
if(rKx&1)
{
//本来对于原始算法为rKx^=Gx;rKx>>=1;
//由于我们此处省略了最高位,因此,
//此处相当于Gx=(crcPoly>>1),因此,
//最后算法为rKx=(rKx>>1)^(crcPoly>>1)
rKx>>=1;
rKx^=Gx;
}
else
rKx>>=1;
}
m_crcTable[Kx]=rKx;
}
}
U32 CCRCTable256::CRC(BYTE* k, U32 l, U32 c)
{
if(m_bits!=32)
c&=((1<<m_bits)-1);
while(l-->0){
c = (c >>8)^m_crcTable[(U08)(c^*k++ )];
}
return c;
}
#ifdef __YM_COMMENT__
U32 CRC32table[] = {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
#endif
//
//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 CCRCTable256::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 CRC16table[] = {
0x00000000, 0x0000c0c1, 0x0000c181, 0x00000140, 0x0000c301, 0x000003c0, 0x00000280, 0x0000c241,
0x0000c601, 0x000006c0, 0x00000780, 0x0000c741, 0x00000500, 0x0000c5c1, 0x0000c481, 0x00000440,
0x0000cc01, 0x00000cc0, 0x00000d80, 0x0000cd41, 0x00000f00, 0x0000cfc1, 0x0000ce81, 0x00000e40,
0x00000a00, 0x0000cac1, 0x0000cb81, 0x00000b40, 0x0000c901, 0x000009c0, 0x00000880, 0x0000c841,
0x0000d801, 0x000018c0, 0x00001980, 0x0000d941, 0x00001b00, 0x0000dbc1, 0x0000da81, 0x00001a40,
0x00001e00, 0x0000dec1, 0x0000df81, 0x00001f40, 0x0000dd01, 0x00001dc0, 0x00001c80, 0x0000dc41,
0x00001400, 0x0000d4c1, 0x0000d581, 0x00001540, 0x0000d701, 0x000017c0, 0x00001680, 0x0000d641,
0x0000d201, 0x000012c0, 0x00001380, 0x0000d341, 0x00001100, 0x0000d1c1, 0x0000d081, 0x00001040,
0x0000f001, 0x000030c0, 0x00003180, 0x0000f141, 0x00003300, 0x0000f3c1, 0x0000f281, 0x00003240,
0x00003600, 0x0000f6c1, 0x0000f781, 0x00003740, 0x0000f501, 0x000035c0, 0x00003480, 0x0000f441,
0x00003c00, 0x0000fcc1, 0x0000fd81, 0x00003d40, 0x0000ff01, 0x00003fc0, 0x00003e80, 0x0000fe41,
0x0000fa01, 0x00003ac0, 0x00003b80, 0x0000fb41, 0x00003900, 0x0000f9c1, 0x0000f881, 0x00003840,
0x00002800, 0x0000e8c1, 0x0000e981, 0x00002940, 0x0000eb01, 0x00002bc0, 0x00002a80, 0x0000ea41,
0x0000ee01, 0x00002ec0, 0x00002f80, 0x0000ef41, 0x00002d00, 0x0000edc1, 0x0000ec81, 0x00002c40,
0x0000e401, 0x000024c0, 0x00002580, 0x0000e541, 0x00002700, 0x0000e7c1, 0x0000e681, 0x00002640,
0x00002200, 0x0000e2c1, 0x0000e381, 0x00002340, 0x0000e101, 0x000021c0, 0x00002080, 0x0000e041,
0x0000a001, 0x000060c0, 0x00006180, 0x0000a141, 0x00006300, 0x0000a3c1, 0x0000a281, 0x00006240,
0x00006600, 0x0000a6c1, 0x0000a781, 0x00006740, 0x0000a501, 0x000065c0, 0x00006480, 0x0000a441,
0x00006c00, 0x0000acc1, 0x0000ad81, 0x00006d40, 0x0000af01, 0x00006fc0, 0x00006e80, 0x0000ae41,
0x0000aa01, 0x00006ac0, 0x00006b80, 0x0000ab41, 0x00006900, 0x0000a9c1, 0x0000a881, 0x00006840,
0x00007800, 0x0000b8c1, 0x0000b981, 0x00007940, 0x0000bb01, 0x00007bc0, 0x00007a80, 0x0000ba41,
0x0000be01, 0x00007ec0, 0x00007f80, 0x0000bf41, 0x00007d00, 0x0000bdc1, 0x0000bc81, 0x00007c40,
0x0000b401, 0x000074c0, 0x00007580, 0x0000b541, 0x00007700, 0x0000b7c1, 0x0000b681, 0x00007640,
0x00007200, 0x0000b2c1, 0x0000b381, 0x00007340, 0x0000b101, 0x000071c0, 0x00007080, 0x0000b041,
0x00005000, 0x000090c1, 0x00009181, 0x00005140, 0x00009301, 0x000053c0, 0x00005280, 0x00009241,
0x00009601, 0x000056c0, 0x00005780, 0x00009741, 0x00005500, 0x000095c1, 0x00009481, 0x00005440,
0x00009c01, 0x00005cc0, 0x00005d80, 0x00009d41, 0x00005f00, 0x00009fc1, 0x00009e81, 0x00005e40,
0x00005a00, 0x00009ac1, 0x00009b81, 0x00005b40, 0x00009901, 0x000059c0, 0x00005880, 0x00009841,
0x00008801, 0x000048c0, 0x00004980, 0x00008941, 0x00004b00, 0x00008bc1, 0x00008a81, 0x00004a40,
0x00004e00, 0x00008ec1, 0x00008f81, 0x00004f40, 0x00008d01, 0x00004dc0, 0x00004c80, 0x00008c41,
0x00004400, 0x000084c1, 0x00008581, 0x00004540, 0x00008701, 0x000047c0, 0x00004680, 0x00008641,
0x00008201, 0x000042c0, 0x00004380, 0x00008341, 0x00004100, 0x000081c1, 0x00008081, 0x00004040
};
#endif
//
//CRC-16 : x16 + x15 + x2 + x0
VOID CCRCTable256::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);
}
//
//CRC-CCITT: X16 + X12 + X5 + X0
VOID CCRCTable256::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);
}
VOID CCRCTable256::ShowCRCTable(CString* str)
{
if(str==NULL)
{
TRACE("\n---------256 Table-----------");
for(int i=0;i<256;i++)
{
if(!(i%8))
{
TRACE("\nYM CRC%2d:%02X - 0x%08X",m_bits,i,m_crcTable[i]);
}
else
{
TRACE(", 0x%08X",m_crcTable[i]);
}
}
TRACE("\n");
}
else
{
CString str1;
str1=("--------256 Table-----------");
*str+=str1;
for(int i=0;i<256;i++)
{
if(!(i%8))
{
str1.Format("\r\nYM CRC%2d:%02X - 0x%08X",m_bits,i,m_crcTable[i]);
}
else
{
str1.Format(", 0x%08X",m_crcTable[i]);
}
*str+=str1;
}
str1=("\r\n");
*str+=str1;
}
}
VOID CCRCTable16::CreateCRCTable(BOOL* crcPoly,S32 count)
{
U32 Gx = 0;
U32 bits = 0;
while(--count>=0)
{
if(crcPoly[count])
{
bits=count;
break;
}
}
while(count>0)
{
Gx<<=1;
if(crcPoly[bits-count--])Gx+=1;
}
if(bits)
CreateCRCTable(Gx,bits);
}
VOID CCRCTable16::CreateCRCTable(U32 crcPoly, U32 bits)
{
m_bits = bits;
m_crcPoly = crcPoly;
U32 Gx = crcPoly;
U32 Kx = 0;
// 对 0x0K K=0~F 求解
for(Kx=0;Kx<16;Kx++)
{
U32 rKx=(U32)Kx;
for(int i=0;i<8;i++)
{
if(rKx&1)
{
rKx>>=1;
rKx^=Gx;
}
else
rKx>>=1;
}
m_crcTable[0][Kx]=rKx;
}
// 对 0xK0 K=0~F 求解
for(Kx=0;Kx<16;Kx++)
{
U32 rKx=(U32)Kx;
for(int i=0;i<4;i++)
{
if(rKx&1)
{
rKx>>=1;
rKx^=Gx;
}
else
rKx>>=1;
}
m_crcTable[1][Kx]=rKx;
}
}
VOID CCRCTable16::ShowCRCTable(CString* str)
{
if(str==NULL)
{
TRACE("\n---------16 Table Lo-----------");
{
for(int i=0;i<16;i++)
{
if(!(i%4))
{
TRACE("\nYM CRC%2d:%02X - 0x%08X,",m_bits,i,m_crcTable[0][i]);
}
else
{
TRACE(" 0x%08x,",m_crcTable[0][i]);
}
}
}
TRACE("\n---------16 Table Hi-----------");
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -