让代码更简单

C#CRC校验计算源码

重要:本文最后更新于2021-09-10 15:19:44,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

循环冗余校验码(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在线计算中的值一样。

感觉很棒!可以赞赏支持我哟~

5 打赏

评论 (1)

登录后评论
谢谢分享,这正是我要找的 ,我的博客,欢迎回访
QQ咨询 邮件咨询 狗哥推荐