CRC校验

CRC检验原理实质是利用模2除法(除数由生成多项式决定)来求得余数,生成检验码,将其并入数据项末尾作为数据序列(比特序列)发送出去。
接收方拿到数据序列后,使用相同的生成多项式进行模2除法,若可除尽,则正确;反之,则数据有误。

模2除法可用计算机方法进行表示。相关算法有 直接计算法 、驱动表法、 直驱表法、颠倒的直驱表法等。

由于直接计算法效能较差,故有其衍生算法:驱动表法、 直驱表法、颠倒的直驱表法,进一步进行优化。

除了生成多项式可影响检验码结果,CRC还有多种参数可对其产生影响。

CRC的参数模型

实际上,这时已经可以计算出与WINRAR相同的CRC32值了。但是会发现,算出的结果和WINRAR是不
一样的,为什么?因为不仅仅是生成项POLY会影响到CRC值,还有很多参数会影响到最终的CRC值!
CRC计算,需要有CRC参数模型,比如CRC32的参数模型是:
Name : "CRC-32"
Width : 32
Poly : 04C11DB7
Init : FFFFFFFF
RefIn : True
RefOut : True
XorOut : FFFFFFFF
Check : CBF43926
解释:
NAME
名称
WIDTH
宽度,即CRC比特数
POLY
生成项的简写。以16进制表示,即是0x04C11DB7。忽略了最高位的"1",即完整的生成项是
0x104C11DB7。
重要的一点是,这是“未颠倒”的生成项!前面说过,“颠倒的”生成项是0xEDB88320。

INIT
这是算法开始时寄存器的初始化预置值,十六进制表示。
这个值可以直接赋值给“直驱表法”算法中的寄存器,作为寄存器的初始值!
而对于“驱动表法”算法及“直接计算法”,寄存器的初始值必须是0!前面几次循环先将待测数
据移入到寄存器中,当寄存器装满后,再用这个初始化预置值去XOR寄存器,这样寄存器就被这个
值初始化了!
这点很重要!!如果在“驱动表法”算法开始时,寄存器的初始值不为0,那么寄存器中的值就会
相当于是待测数据了,这样算出的CRC结果就不对了!我们的目的是用预置值去初始化寄存器,而
不是将预置值作为待测数据去处理!
REFIN
这个值是真TRUE或假FALSE。
如果这个值是FALSE,表示待测数据的每个字节都不用“颠倒”,即BIT7仍是作为最高位,BIT0
作为最低位。
如果这个值是TRUE,表示待测数据的每个字节都要先“颠倒”,即BIT7作为最低位,BIT0作为最
高位。
REFOUT
这个值是真TRUE或假FALSE。
如果这个值是FALSE,表示计算结束后,寄存器中的值直接进入XOROUT处理即可。
如果这个值是TRUE,表示计算结束后,寄存器中的值要先“颠倒”,再进入XOROUT处理。注意,
这是将整个寄存器的值颠倒,因为寄存器的各个字节合起来表达了一个值,如果只是对各个字节各
自颠倒,那结果值就错误了。
XOROUT
这是W位长的16进制数值。
这个值与经REFOUT后的寄存器的值相XOR,得到的值就是最终正式的CRC值!
CHECK
这不是定义值的一部分,这只是字串"123456789"用这个CRC参数模型计算后得到的CRC值,作为参
考。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值