- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对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;
}
🌎总结
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。