我是靠谱客的博主 瘦瘦日记本,这篇文章主要介绍【原创】验证: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,完毕!

备注

验证过程,可以多个步骤优化成一个步骤,这样计算会更简单。但理解难度会提高。因此,文中保留未优化的验证步骤。

标题计算代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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循环冗余校验的全部内容,更多相关【原创】验证内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部