我是靠谱客的博主 瘦瘦日记本,最近开发中收集的这篇文章主要介绍【原创】验证:CRC-32循环冗余校验,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

验证网址:

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循环冗余校验所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部