/* ^H -a@QM
在单片机(ARM)OTA时经常会用到CRC来校验接收文件的正确性,由于接收是分包的,整个包内容是否正确,可以通过每接收一包进行一次校验 (I#mo2
直到所有包接收完成,也可以在所有数据接收完成后,从flash中一次性计算,但是都面临分包计算的过程,除非单片机内存足够大,所以我们还 ExM VGe
是不要去想不太现实的事实,就用下面这个计算函数吧。 ia (&$a8X
*/ 4bcd=a;
unsigned int Xcrc32(unsigned int crc, const void *base, unsigned int len) ^]D+H9Tl
{ Bg] %
unsigned int crc32 = 0; ;E,i
unsigned char *p = (unsigned char *)base; l"7#(a
const unsigned int table[16] = { LpL$=9
0x00000000, 0x1DB71064, 0x3B6E20C8, 0x26D930AC, 0x76DC4190, 0x6B6B51F4, 0x4DB26158, 0x5005713C, cvQAo|
0xEDB88320, 0xF00F9344, 0xD6D6A3E8, 0xCB61B38C, 0x9B64C2B0, 0x86D3D2D4, 0xA00AE278, 0xBDBDF21C @j"6f|d
}; }KO <II
,"F0#5
crc32 = table[(crc ^ *p ) & 0x0F] ^ (crc >> 4); w IP4Z^
crc32 = table[(crc32 ^ (*p++ >> 4)) & 0x0F] ^ (crc32 >> 4); {5fL!`6w
len--; DN iH" 0%
while (len--) { nEPTTp+B
crc32 = table[(crc32 ^ *p ) & 0x0F] ^ (crc32 >> 4); G8 q<)
crc32 = table[(crc32 ^ (*p++ >> 4)) & 0x0F] ^ (crc32 >> 4); , 6Jw
} K9 ]zUew
return crc32; hzU(XW
} ^KnK
\