📄 crc_fw.cpp
字号:
#include <stdio.h>
/*计算所得数据存放数组*/
unsigned long int crc32_table[256];
/*profisafe中的数组*/
unsigned long int crc32_table_old[256]={
0x00000000,0xF4ACFB13,0x1DF50D35,0xE959F626,0x3BEA1A6A,0xCF46E179,0x261F175F,0xD2B3EC4C,
0x77D434D4,0x8378CFC7,0x6A2139E1,0x9E8DC2F2,0x4C3E2EBE,0xB892D5AD,0x51CB238B,0xA567D898,
0xEFA869A8,0x1B0492BB,0xF25D649D,0x06F19F8E,0xD44273C2,0x20EE88D1,0xC9B77EF7,0x3D1B85E4,
0x987C5D7C,0x6CD0A66F,0x85895049,0x7125AB5A,0xA3964716,0x573ABC05,0xBE634A23,0x4ACFB130,
0x2BFC2843,0xDF50D350,0x36092576,0xC2A5DE65,0x10163229,0xE4BAC93A,0x0DE33F1C,0xF94FC40F,
0x5C281C97,0xA884E784,0x41DD11A2,0xB571EAB1,0x67C206FD,0x936EFDEE,0x7A370BC8,0x8E9BF0DB,
0xC45441EB,0x30F8BAF8,0xD9A14CDE,0x2D0DB7CD,0xFFBE5B81,0x0B12A092,0xE24B56B4,0x16E7ADA7,
0xB380753F,0x472C8E2C,0xAE75780A,0x5AD98319,0x886A6F55,0x7CC69446,0x959F6260,0x61339973,
0x57F85086,0xA354AB95,0x4A0D5DB3,0xBEA1A6A0,0x6C124AEC,0x98BEB1FF,0x71E747D9,0x854BBCCA,
0x202C6452,0xD4809F41,0x3DD96967,0xC9759274,0x1BC67E38,0xEF6A852B,0x0633730D,0xF29F881E,
0xB850392E,0x4CFCC23D,0xA5A5341B,0x5109CF08,0x83BA2344,0x7716D857,0x9E4F2E71,0x6AE3D562,
0xCF840DFA,0x3B28F6E9,0xD27100CF,0x26DDFBDC,0xF46E1790,0x00C2EC83,0xE99B1AA5,0x1D37E1B6,
0x7C0478C5,0x88A883D6,0x61F175F0,0x955D8EE3,0x47EE62AF,0xB34299BC,0x5A1B6F9A,0xAEB79489,
0x0BD04C11,0xFF7CB702,0x16254124,0xE289BA37,0x303A567B,0xC496AD68,0x2DCF5B4E,0xD963A05D,
0x93AC116D,0x6700EA7E,0x8E591C58,0x7AF5E74B,0xA8460B07,0x5CEAF014,0xB5B30632,0x411FFD21,
0xE47825B9,0x10D4DEAA,0xF98D288C,0x0D21D39F,0xDF923FD3,0x2B3EC4C0,0xC26732E6,0x36CBC9F5,
0xAFF0A10C,0x5B5C5A1F,0xB205AC39,0x46A9572A,0x941ABB66,0x60B64075,0x89EFB653,0x7D434D40,
0xD82495D8,0x2C886ECB,0xC5D198ED,0x317D63FE,0xE3CE8FB2,0x176274A1,0xFE3B8287,0x0A977994,
0x4058C8A4,0xB4F433B7,0x5DADC591,0xA9013E82,0x7BB2D2CE,0x8F1E29DD,0x6647DFFB,0x92EB24E8,
0x378CFC70,0xC3200763,0x2A79F145,0xDED50A56,0x0C66E61A,0xF8CA1D09,0x1193EB2F,0xE53F103C,
0x840C894F,0x70A0725C,0x99F9847A,0x6D557F69,0xBFE69325,0x4B4A6836,0xA2139E10,0x56BF6503,
0xF3D8BD9B,0x07744688,0xEE2DB0AE,0x1A814BBD,0xC832A7F1,0x3C9E5CE2,0xD5C7AAC4,0x216B51D7,
0x6BA4E0E7,0x9F081BF4,0x7651EDD2,0x82FD16C1,0x504EFA8D,0xA4E2019E,0x4DBBF7B8,0xB9170CAB,
0x1C70D433,0xE8DC2F20,0x0185D906,0xF5292215,0x279ACE59,0xD336354A,0x3A6FC36C,0xCEC3387F,
0xF808F18A,0x0CA40A99,0xE5FDFCBF,0x115107AC,0xC3E2EBE0,0x374E10F3,0xDE17E6D5,0x2ABB1DC6,
0x8FDCC55E,0x7B703E4D,0x9229C86B,0x66853378,0xB436DF34,0x409A2427,0xA9C3D201,0x5D6F2912,
0x17A09822,0xE30C6331,0x0A559517,0xFEF96E04,0x2C4A8248,0xD8E6795B,0x31BF8F7D,0xC513746E,
0x6074ACF6,0x94D857E5,0x7D81A1C3,0x892D5AD0,0x5B9EB69C,0xAF324D8F,0x466BBBA9,0xB2C740BA,
0xD3F4D9C9,0x275822DA,0xCE01D4FC,0x3AAD2FEF,0xE81EC3A3,0x1CB238B0,0xF5EBCE96,0x01473585,
0xA420ED1D,0x508C160E,0xB9D5E028,0x4D791B3B,0x9FCAF777,0x6B660C64,0x823FFA42,0x76930151,
0x3C5CB061,0xC8F04B72,0x21A9BD54,0xD5054647,0x07B6AA0B,0xF31A5118,0x1A43A73E,0xEEEF5C2D,
0x4B8884B5,0xBF247FA6,0x567D8980,0xA2D17293,0x70629EDF,0x84CE65CC,0x6D9793EA,0x993B68F9};
/*生成多项式十六进制数据表示(不含另外加的1)*/
unsigned long int ulPolynomial = 0xF4ACFB13;
/*计算法获得crc32码*/
unsigned long CRC32_jsf(unsigned long int c)
{
unsigned long int crc,temp;
crc=0;
temp=0;
for(unsigned long int i = 0; i <= c; i++)
{
temp= temp^(i<<24);
for (int j = 0; j < 8; j++)
{
unsigned long int t1,t2;
unsigned long int flag=temp&0x80000000;
t1=(temp<<1);
if(flag==0)
t2=0;
else
t2=ulPolynomial;
temp =t1^t2 ;
}
crc=temp;
}
return crc;
}
/*查表法获得crc32码*/
unsigned char data[300]={0};
unsigned long CRC32_cbf(unsigned long len)
{
unsigned long oldcrc32;
unsigned long crc32;
unsigned long oldcrc;
unsigned int charcnt;
unsigned char c,t;
oldcrc32 = 0x00010203; //初值为0
charcnt=0;
for(unsigned long k=0;k<=len;k++)
{
data[k]=k;
}
for( charcnt=0;charcnt<=len;charcnt++)
{
t= (oldcrc32 >> 24)&0xFF; //要移出的字节的值
oldcrc=crc32_table_old[t]; //根据移出的字节的值查表
c=data[charcnt+4]; //新移进来的字节值
oldcrc32= (oldcrc32 << 8) | c; //将新移进来的字节值添在寄存器末字节中
oldcrc32=oldcrc32^oldcrc; //将寄存器与查出的值进行xor运算
}
crc32=oldcrc32;
return crc32;
}
/*主函数用于比对profisafe中的crc32数据是否有误,另外计算0~255(256字节的数据)的crc32码*/
void main()
{
for(int i = 0; i <= 0xFF; i++)//i表示crc要验证的数据(0~255)
{
crc32_table[i]= i<< 24; //由于i是32位,把后8位移至最前面。
for (int j = 0; j < 8; j++)
{
unsigned long int t1,t2;
unsigned long int flag=crc32_table[i]&0x80000000;//验证32位中的最高位是否为1
t1=(crc32_table[i] << 1);//将数据向左移一位,结果记入t1
if(flag==0)
t2=0;//如果32位中的最高位为1,与t1异或的为0
else
//如果32位中的最高位为1,与t1异或的为16进制生成多项式数据表达式,相当于作除运算
t2=ulPolynomial;
crc32_table[i] =t1^t2 ;
} //循环结束时,crc32_table[i]的值即为数据i的crc32码
int result=0;
//比对计算所的crc32_table[i]和profisafe中的crc32数据是否一致
if(crc32_table[i]==crc32_table_old[i])
{
result=1;
}
// printf("0%XH,",crc32_table[i]);//crc32_table[i]结果
// printf("%X",crc32_table_old[i]);//crc32_table_old[i]结果
printf("i=%d crc32[%d]=%X crc32_old[%d]=%X result=%d\n",i,i,crc32_table[i],i,crc32_table_old[i],result);
}
unsigned long crc_256_jsf,crc_256_cbf ;
crc_256_jsf= CRC32_jsf(255);
crc_256_cbf= CRC32_cbf(255);
int result=0;
if(crc_256_cbf==crc_256_jsf)
{
result=1;
}
printf(" crc_256_jsf=%X crc_256_cbf=%X result=%d\n",crc_256_jsf,crc_256_cbf,result);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -