用过的数据校验方式----奇偶、校验和、CRC

一、奇偶校验

根据被传输的一组二进制代码中“1”的个数是奇数或偶数来进行校验。

通常专门设置一个奇偶校验位,存放代码中“1”的个数为奇数还是偶数。奇校验时校验位为奇数,偶校验时校验位为偶数。

eg.10001100 (1) -> 最后一位为校验位

 

二、校验和

校验一组数据项的和是否正确。通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255。

eg. 数据01020304的校验和为a。

 

三、CRC校验(循环冗余检查)

a> 设置CRC寄存器,并给其赋值FFFF(hex)。

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

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

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

e> 重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。

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

g> 最终CRC寄存器的内容即为CRC值。

常用的16位CRC循环冗余校验标准多项式如下:  

CRC(16位) = X16+X15+X2+1,其对应校验二进制位列为1 1000 0000 0000 0101

0xa001 : 1010 0000 0000 0001

uint16 CalcCRC(byte* buf, int len)
{
	unsigned int crc = 0xffff;//a.设置CRC寄存器
	int i, j;
	for (j = 0; j < len; j++)//f.重复b.到e.
	{
		crc = crc^buf[j];    //b.将第一个8bit字符与crc低8位异或
		for (i = 0; i < 8; i++)//e.重复8次
		{
			if ((crc & 0x0001) > 0) //c.判断LSB状态 是否为1
			{
				crc = crc >> 1;    //d.LSB为1 右移一位并与标准多项式异或
				crc = crc ^ 0xa001;//a001为标准多项式转化后16进制
			}
			else
			{
				crc = crc >> 1;//d.右移一位 默认MSB补零
			}
		}
	}
	return crc;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(通讯协议)