概述
验证网址:
http://www.ip33.com/crc.html
CRC-32/MPEG-2验证
需要校验的数据:abc
数据的十六进制:61 62 63
参数模型:CRC-32/MPEG-2
宽度:32
多项式表达式:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
多项式:04C11DB7
初始值:FFFFFFFF
结果异或值:00000000
输入数据反转:NO
输出数据反转:NO
校验结果:9B73448C
将9B73448C添加到校验的数据后面:61 62 63 9B 73 44 8C,重新计算校验结果为00000000,校验完成.
CRC-32自定义,非标准,测试1
需要校验的数据:abc
数据的十六进制:61 62 63
参数模型:CRC-32
宽度:32
多项式表达式:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
多项式:04C11DB7
初始值:FFFFFFFF
结果异或值:FFFFFFFF
输入数据反转:NO
输出数据反转:NO
校验结果:648CBB73
将校验结果648CBB73与结果异或值:FFFFFFFF进行异或运算,得到9B73448C。
将9B73448C补充到检验数据末尾,61 62 63 9B 73 44 8C,再次进行校验,得到结果FFFFFFFF。
与结果异或值再次进行异或,结果为00000000.校验成功!
CRC-32自定义,非标准,测试2
需要校验的数据:abc
数据的十六进制:61 62 63
参数模型:CRC-32
宽度:32
多项式表达式:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
多项式:04C11DB7
初始值:FFFFFFFF
结果异或值:FFFFFFFF
输入数据反转:NO
输出数据反转:YES
校验结果:CEDD3126,
二进制:11001110110111010011000100100110
倒序排:01100100100011001011101101110011(输出数据反转:YES)
对应的十六进制数字为648CBB73。
将648CBB73与结果异或值:FFFFFFFF进行异或运算,得到9B73448C。
将9B73448C补充到检验数据末尾,61 62 63 9B 73 44 8C,再次进行校验,得到结果FFFFFFFF。
与结果异或值再次进行异或,结果为00000000.校验成功!
CRC-32验证
需要校验的数据:abc
数据的十六进制:61 62 63
参数模型:CRC-32
宽度:32
多项式表达式:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
多项式:04C11DB7
初始值:FFFFFFFF
结果异或值:FFFFFFFF
输入数据反转:YES
输出数据反转:YES
校验结果:352441C2
将352441C2添加到校验的数据后面:61 62 63 35 24 41 C2,重新计算校验结果为4FBA0094,不正确.
校验结果:352441C2,
二进制:00110101001001000100000111000010
倒序排:01000011100000100010010010101100(输出数据反转:YES)
对应的十六进制数字为438224AC。
将438224AC与结果异或值:FFFFFFFF进行异或运算,得到BC7DDB53。
将BC7DDB53补充到检验数据末尾,61 62 63 BC 7D DB 53,再次进行校验,得到结果B0202D58。不正确!
对BC7DDB53按字节进行反转,得到3DBEDBCA。
BC7DDB53,二进制:10111100 01111101 11011011 01010011
3DBEDBCA,二进制:00111101 10111110 11011011 11001010
将3DBEDBCA补充到检验数据末尾,61 62 63 3D BE DB CA,再次进行校验,得到结果FFFFFFFF,再与”结果异或值:FFFFFFFF“进行异或运算,结果为00000000。
验证正确。
总结:
1、最常用的校验为CRC-32校验,但也是最折腾的
2、验证顺序
2.1计算出校验结果
2.2恢复数据反向(重新二进制倒序)
2.3与FFFFFFFF进行异或
2.4对这个32位的正数,分割为4个字节,每个字节再进行反转(重新二进制倒序),在组成一个32位整数。
2.5将此整数附加到原数据末尾,进行校验
2.6校验结果为FFFFFFFF,再与结果异或值进行异或运算,得到00000000,完毕!
备注
验证过程,可以多个步骤优化成一个步骤,这样计算会更简单。但理解难度会提高。因此,文中保留未优化的验证步骤。
标题计算代码:
void crc32_check(uint32_t crc)
{
uint32_t data = 0;
//恢复数据反向(重新二进制倒序)
for (size_t i = 0; i < 32; i++)
{
data <<= 1;
data |= (crc >> i) & 1;
}
//与结果异或值:FFFFFFFF进行异或运算,得到BC7DDB53。
crc = data ^ 0xFFFFFFFF;
//对BC7DDB53按字节进行反转,得到3DBEDBCA。
data = 0;
for (size_t i = 0; i < 4; i++)
{
uint8_t data8 = (crc >> (i * 8)) & 0xFF;
uint8_t data1 = 0x00;
for (size_t i = 0; i < 8; i++)
{
data1 <<= 1;
data1 |= (data8 >> i) & 1;
}
data |= data1<< (i * 8);
}
printf("0x%x", data);
}
最后
以上就是瘦瘦日记本为你收集整理的【原创】验证:CRC-32循环冗余校验的全部内容,希望文章能够帮你解决【原创】验证:CRC-32循环冗余校验所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复