循环冗余校验码(CRC),简称循环码,是一种常用的、具有检错、纠错能力的校验码,在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据校验。奇偶校验码和海明校验码都是采用奇偶检测为手段检错和纠错的(奇偶校验码不具有纠错能力),而循环冗余校验则是通过某种数学运算来建立数据位和校验位的约定关系的。
在PLC单片机等应用环境中CRC校验使用较多,下面提供的是16位宽度的MODBUS协议CRC校验码C#计算方法。
复制
/// <summary> /// CRC计算 /// </summary> /// <param name="arr">源数据</param> /// <returns></returns> public static byte[] Crc(byte[] arr) { UInt32 i; UInt16 j, uwCrcReg = 0xFFFF; for (i = 0; i < arr.Length; i++) { uwCrcReg ^= arr[i]; for (j = 0; j < 8; j++) { if ((uwCrcReg & 0x0001) != 0) { uwCrcReg = (UInt16)((UInt16)(uwCrcReg >> 1) ^ (UInt16)0xA001); } else { uwCrcReg = (UInt16)(uwCrcReg >> 1); } } } byte[] CRC = new byte[2]; CRC[0] = (byte)(uwCrcReg); CRC[1] = (byte)(uwCrcReg >> 8); return CRC; }
实测可用,计算结果与某站的CRC在线计算中的值一样。
评论 (1)