多字节CRC步骤 | 字节3 | 字节2 | 字节1 | 字节0 | 说明 | | | | AB | CD | 源数据 | 1 | AB | 00 | 00 | | 高8位左移16位 | 2 | | CRC(AB)高 | CRC(AB)低 | | 高8位取模运算 | | 3 | | CD | 00 | 00 | 低8位左移16位 | 4 | | CD = CRC(AB)高 ^ CD | CD对应CRC(AB)高 | 5 | | | CRC(CD)高 | CRC(CD)低 | 低8位取模运算 | 6 | | | CRC(ABCD)高 | CRC(ABCD)低 | 高低CRC结果合并 | 7 | | | CRC(ABCD) &= 0xffff; | 结果只取低16位 |
下一字节运算 依次循环步骤3~7,直到位串结束。 --由于结果只取低16位,高位截除,而多字节运算是必然有溢出,截除的高位不知道,所以用多项式验证整个16位数得不到正确的结果了 //程序如下,全局int变量crc中保留了前一次的CRC运算结果: uint table_crc(uchar *ptr,uchar len) // 字节查表法求CRC,查表操作就是一次CRC运算 { uchar da; while(len--!=0) { da=(uchar) (crc/256); // 以8 位二进制数暂存CRC 的高8 位 crc<<=8; // 左移8 位 crc^=crc_ta[da^*ptr]; // 高字节和当前数据XOR 再查表 ptr++; } return(crc); } |