crc校验详解

  • 格式:doc
  • 大小:30.00 KB
  • 文档页数:2

CRC校验专题
以CRC-16为例,说明CRC的计算过程:
1.设置CRC寄存器,并给其赋值FFFF(hex)。

2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。

3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

5.重复第3与第4步直到8次移位全部完成。

此时一个8-bit数据处理完毕。

6.重复第2至第5步直到所有数据全部处理完成。

7.最终CRC寄存器的内容即为CRC值。

翻译:
1.意思是首先寄存器中的值是1111111111111111
2.数据第一个字节一个字节=8位用二进制表示就是【00000000-11111111】之间用
这个数值跟寄存器中的16个1中的后8位进行异或(异或不知道什么意思的自己查简单理解就是同为0 异为1)然后把这个数值保存到寄存器中
3.判断最后一位是否为0 如果为0寄存器中的值向右移动一位前面补零如果为1 拿
寄存器中的值与多项式进行异或。

4.检查当前寄存器中的最后一位如果是0 重复第三步;如果是寄存器中的值与多项式
进行异或
5.重复3与4直到8此移位完成。

6.重复第2到第五步知道正规数组的数据验证完成
7.最终计算出的就是CRC的值
实例:
实例byte[] bufs=new byte[]{0x2f,0x12,0x31} crc16 多项式码假设是0x8408 二进制形式就是1000010000001000
1crc=0xffff; 用二进制表示就是1111111111111111
2拿出bufs中第一个字节0x2f 二进制表示00101111 跟寄存器中的后8位进行异或得到1111111111010000
3判断CRC寄存器中最后一位当前为0 寄存器右移一位得到0111111111101000 (如果为1就与多项式进行异或)
4判断当前寄存器中的值当前最后一位为0 所以重复第三步继续右移得到0011111111110100 最后还是0 在重复第三步0001111111111010 最后还是0 继续第三步0000111111111101 这时最后一位为1了这时与多项式进行异或得到1011101111111001
5重复判断知道判断完8次
6然后再重复第2到第5步直到上面数组中的bufs中三个字节验证完
7最终寄存器中的值就是crc值
下面进行实战C# code 分析
const uint PRESET_VALUE = 0xFFFF; 初始化寄存器的值
const uint POLYNOMIAL = 0x8408; 多项式码
三个参数 1char数组 byte一样 2.数组长度
uint uiCrc16Cal(char[] pucY, int ucX)
{
uint ucI, ucJ;
uint uiCrcValue = PRESET_VALUE; 赋除值
for(ucI = 0; ucI < ucX; ucI++)
{
uiCrcValue = uiCrcValue ^ pucY[ucI]; 进行异或
for(ucJ = 0; ucJ < 8; ucJ++) 由于一个字节 8位所以判段8次
{
if((uiCrcValue & 0x0001) != 0) (*1下面解释)
{
uiCrcValue = (uiCrcValue >> 1) ^ POLYNOMIAL;
} (*2下面解释)
else
{
uiCrcValue = (uiCrcValue >> 1);
} (*3下面解释)
}
}
return uiCrcValue;
}
*1 “&”这个符号在C 、C#等语言上是按位与即按二进制比对1与1 得1 0与1得0 0与0得0 例如:比如:10010001(二进制)&11110000等于10010000(二进制)。

0x0001 就相当于只判断最后一位(仔细思考)
*2 “>>”这个符号是右移符号“^”这个符号是异或符号即1异或0等于1,0异或0等于0。

即:相同得0,相异得1
*3 “>>”移位上面有解释
讲到这种程度你们再不明白就不科学了!直接拿去打印完让张永军给你们讲去吧。