CRC校验的问题(c语言实现CRC校验和)


1. 前面的数 7A 01 00,计算的结果是0X4920

2. 那么把数据CRC加上

3. 测试代码,计算出来的结果对不上,什么情况?可是我把参考模型的全部都选了一遍,也对不上其中一个!!!

4. 换了套代码,还是一样的值,难道说,CRC检验的必须是双数字节吗?我输入的是5个,或许我可以输入6个测试一下,也不行

5. 去CRC官网看了一下

对比下代码发现,CRC-16用的多项式应该是0XA001,总上所述,第3步的代码是错误的。那么我有疑问,为啥第3步的代码居然还有人在用?而且使用正确,我猜测那套产生自己的CRC,又检验自己的CRC,说起来是定制化的一套CRC,不是标准的CRC,所以那套CRC只能自产自销,如果去校验另外一个人产生的标准的CRC数据就会出错了。

 

6. 下面是从gitHUB上下载的代码实际测试可用。https://github.com/lammertb/libcrc

uint16_t crc_sick( const unsigned char *input_str, size_t num_bytes ) { uint16_t crc; uint16_t low_byte; uint16_t high_byte; uint16_t short_c; uint16_t short_p; const unsigned char *ptr; size_t a; crc = CRC_START_SICK; ptr = input_str; short_p = 0; if ( ptr != NULL ) for (a=0; a<num_bytes; a++) { short_c = 0x00FF & (uint16_t) *ptr; if ( crc & 0x8000 ) crc = ( crc << 1 ) ^ CRC_POLY_SICK; else                crc =   crc << 1; crc ^= ( short_c | short_p ); short_p = short_c << 8; ptr++; } low_byte = (crc & 0xFF00) >> 8; high_byte = (crc & 0x00FF) << 8; crc = low_byte | high_byte; return crc; } /* crc_sick */

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM