- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
- 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
- 🍅 玩转CANoe,博客目录大全,点击跳转👉
📙CRC在线计算平台
-
记录下,在做CRC32校验算法中遇到的问题,以及解决方法,还有一些可参考的文档
-
首先我们要有一个标准的CRC校验算法的参考标准,来验证我们算的对不对,简单,免费,好用的一个在线计算平台http://www.ip33.com/crc.html
-
我现在想验证 byte test[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88}; 在下面条件下的CRC32结果
1,多项式:0x04C11DB7
2,输入初始值:0xFFFFFFFF
3,输入反转:TRUE
4, 输出反转:TRUE
5,输出异或:0xFFFFFFFF
CRC32算法的原理,这些参数,网上资料很多,不在此讲解
📙参考代码
- 网上也有很多CRC32代码 的参考文章,良莠不齐,我觉得 这个文章挺不错的,基于C语言版本的。https://zhuanlan.zhihu.com/p/385185293
- 我列出了部分代码,重点在于基于这个代码,发现它的
输入反转
这点代码有问题crc ^= ReflectedData(*buffer++, REF_8BIT) << 24;
,无法得到正确的CRC值,输出反转没问题。
uint32_t ReflectedData(uint32_t data, REFLECTED_MODE mode)
{data = ((data & 0xffff0000) >> 16) | ((data & 0x0000ffff) << 16);data = ((data & 0xff00ff00) >> 8) | ((data & 0x00ff00ff) << 8);data = ((data & 0xf0f0f0f0) >> 4) | ((data & 0x0f0f0f0f) << 4);data = ((data & 0xcccccccc) >> 2) | ((data & 0x33333333) << 2);data = ((data & 0xaaaaaaaa) >> 1) | ((data & 0x55555555) << 1);switch (mode){case REF_32BIT:return data;case REF_16BIT:return (data >> 16) & 0xffff;case REF_8BIT:return (data >> 24) & 0xff;case REF_7BIT:return (data >> 25) & 0x7f;case REF_6BIT:return (data >> 26) & 0x7f;case REF_5BIT:return (data >> 27) & 0x1f;case REF_4BIT:return (data >> 28) & 0x0f;}return 0;
}uint32_t CheckCrc32(uint32_t poly, uint32_t init, bool refIn, bool refOut, uint32_t xorOut,const uint8_t *buffer, uint32_t length)
{uint32_t i = 0;uint32_t crc = init;while (length--){if (refIn == true){crc ^= ReflectedData(*buffer++, REF_8BIT) << 24;}else{crc ^= (*buffer++) << 24;}for (i = 0; i < 8; i++){if (crc & 0x80000000){crc <<= 1;crc ^= poly;}else{crc <<= 1;}}}if (refOut == true){crc = ReflectedData(crc, REF_32BIT);}return crc ^ xorOut;
}
📙 字节按位反转算法
- 上面定位了是输入按位反转代码出现了,我们就要去了解什么是按位反转,怎么写这个算法,参考如下https://www.cnblogs.com/Imageshop/p/12116382.html
📙 CAPL 形式的CRC32算法
on prestart
{byte test[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};write("crc32 1 : 0x%x",crc32(test,8));//}byte Reverse8U(byte x)
{x = (x & 0xaa) >> 1 | (x & 0x55) << 1;x = (x & 0xcc) >> 2 | (x & 0x33) << 2;x = (x & 0xf0) >> 4 | (x & 0x0f) << 4;return x;
}dword Reverse32U(dword data )
{ data = ((data & 0xaaaaaaaa) >> 1) | ((data & 0x55555555) << 1);data = ((data & 0xcccccccc) >> 2) | ((data & 0x33333333) << 2);data = ((data & 0xf0f0f0f0) >> 4) | ((data & 0x0f0f0f0f) << 4);data = ((data & 0xff00ff00) >> 8) | ((data & 0x00ff00ff) << 8);data = ((data & 0xffff0000) >> 16) | ((data & 0x0000ffff) << 16);return data;
}dword crc32(byte data[],long length)
{long i ,j;dword crc32;crc32 = 0xFFFFFFFF;for (i = 0;i < length;i++){data[i] = Reverse8U(data[i]);crc32 = crc32 ^(data[i]<<24);for (j = 0;j < 8;j++){if (crc32 & 0x80000000)crc32 = (crc32 << 1) ^ 0x04C11DB7; else crc32 = crc32 << 1;}}crc32 = Reverse32U(crc32);//输出反转crc32 = crc32 ^ 0xFFFFFFFF; //输出异或return crc32;
}
🌎总结
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。