文章首发于浩瀚先森博客

CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。实际上,除 数据通信外,CRC在其它很多领域也是大有用武之地的。例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。

差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现,对原理只能捎带说明一下。若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。

利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督 码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以 确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。

下面提供C#实现的代码:

#region 计算CRC校验码
/// <summary>
/// 计算CRC校验码,并转换为十六进制字符串
/// Cyclic Redundancy Check 循环冗余校验码
/// 是数据通信领域中最常用的一种差错校验码
/// 特征是信息字段和校验字段的长度可以任意选定
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static string get_CRC16_C(byte[] data)
{
byte num = 0xff;
byte num2 = 0xff; byte num3 = 1;
byte num4 = 160;
byte[] buffer = data; for (int i = 0; i < buffer.Length; i++)
{
//位异或运算
num = (byte)(num ^ buffer[i]); for (int j = 0; j <= 7; j++)
{
byte num5 = num2;
byte num6 = num; //位右移运算
num2 = (byte)(num2 >> 1);
num = (byte)(num >> 1); //位与运算
if ((num5 & 1) == 1)
{
//位或运算
num = (byte)(num | 0x80);
}
if ((num6 & 1) == 1)
{
num2 = (byte)(num2 ^ num4);
num = (byte)(num ^ num3);
}
}
}
return byteToHexStr(new byte[] { num, num2 },2);
} #endregion //获取并校验两数据是否一致
public static bool checkCRC(byte[] srcData, byte[] desData)
{
string crc = get_CRC16_C(srcData);
if (crc == byteToHexStr(desData,desData.Length))
return true;
else
return false;
} /// <summary>
/// 字节数组转16进制字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string byteToHexStr(byte[] bytes, int size)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < size; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
}

下面提供C实现的代码:

uint16_t CalcCRC(uint8_t *u8Data, uint8_t u8Size)
{
uint16_t ReturnData;
uint8_t num = 0xff;
uint8_t num2 = 0xff; uint8_t num3 = 1;
uint8_t num4 = 160;
uint8_t buffer[5];
memcpy(buffer,u8Data,u8Size); for (int i = 0; i < u8Size; i++)
{
num = (uint8_t)(num ^ buffer[i]); for (int j = 0; j <= 7; j++)
{
uint8_t num5 = num2;
uint8_t num6 = num; num2 = (uint8_t)(num2 >> 1);
num = (uint8_t)(num >> 1); if ((num5 & 1) == 1)
{
num = (uint8_t)(num | 0x80);
}
if ((num6 & 1) == 1)
{
num2 = (uint8_t)(num2 ^ num4);
num = (uint8_t)(num ^ num3);
}
}
}
ReturnData = num;
ReturnData = ReturnData<<8;
ReturnData |= num2;
return ReturnData; } ITStatus checkCRC(uint8_t *srcData, uint8_t u8srcSize, uint8_t *desData)
{
uint16_t returnData = CalcCRC(srcData, u8srcSize); if(((returnData>>8) == *desData) && ((returnData&0x00ff)==*(desData+1)))
return SET;
else
return RESET; }
 

C#和C实现通过CRC-16 (Modbus)获取CRC值并校验数据(代码)的更多相关文章

  1. Modbus CRC 16 (C#)

    算法 1.预置一个值为 0xFFFF 的 16 位寄存器,此寄存器为 CRC 寄存器. 2.把第 1 个 8 位二进制数据(即通信消息帧的第 1 个字节)与 16 位的 CRC 寄存器相异或,异或的结 ...

  2. 基于MODBUS的CRC

    %ws   WCHAR wszName CRC原理 设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k:生成多项式为G(x),G(x)的最高幂次等于r:CRC多项式为R(x):编码后的带 ...

  3. Modbus协议 CRC 校验码

    CRC(循环冗余校验)在线计算 http://www.ip33.com/crc.html 里面的8005的多项式值,但网上看到的算法都是用A001来异或的 ---------------------- ...

  4. CRC(16位)多项式为 X16+X15+X2+1

    其对应校验二进制位列为1 1000 0000 0000 0101,可这有17位啊,我怎么和16位信息进行异或啊?是不是不要最高位的1 你没有弄明白crc的意思.这17位后面再添上16个零,然后开始抑或 ...

  5. Modbus RTU CRC校验码计算方法

    在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算. CRC计算方法是: 1.  加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2.   ...

  6. php 将16进制数串转换为二进制数据的函数

    /**     * 将16进制数串转换为二进制数据的函数     * @param $hexdata     * @return string bindata     */     function ...

  7. C# CRC - 16

    using System; static class Program { static void Main() { string input = "8000"; var bytes ...

  8. HJ212 CRC 16 (C#)

    算法 CRC16 校验寄存器赋值为 0xFFFF: 取被校验串的第一个字节赋值给临时寄存器: 临时寄存器与 CRC16 校验寄存器的高位字节进行"异或"运算,赋值给 CRC16 校 ...

  9. 国内A股16家上市银行的財务数据与股价的因子分析报告(1)(工具:R)

    分析人:BUPT_LX 研究目的 用某些算法对2014年12月份的16家国内A股上市的商业银行当中11项財务数据(资产总计.负债合计.股本.营业收入.流通股A.少数股东权益.净利润.经营活动的现金流量 ...

随机推荐

  1. css3图片模糊过滤效果

    css3图片过滤效果,鼠标放上后其它图片模糊,鼠标所在位置的图片是清淅的,有效索引出当前的图片,对图片的模糊处理是本特效的亮点,你完全可以将模糊的效果应用于其它的图片特效中,你同样也可借此代码研究一下 ...

  2. 【单页应用】理解MVC

    前言 之前我们为view引入了wrapperSet的概念,想以此解决view局部刷新问题,后来发现这个方案不太合理 view里面插入了业务相关的代码,事实上这个是应该剥离出去,业务的需求千奇百怪,我们 ...

  3. jQuery iPresenter 3D图片旋转

    在线实例 效果一 效果二 使用方法 <div class="htmleaf-container"> <div class="htmleaf-conten ...

  4. HTML5学习笔记三 HTML元素、属性、标题、段落简介

    一.HTML 元素 HTML 元素以开始标签起始 HTML 元素以结束标签终止 元素的内容是开始标签与结束标签之间的内容 某些 HTML 元素具有空内容(empty content) 空元素在开始标签 ...

  5. SharePoint 2013 必备组件之 Windows Server AppFabric 安装错误

    1.如下图,在使用SharePoint2013产品准备工具的时候,网上下载安装Windows Server AppFabric的时候,报错,点击完成重启计算机,重新安装依然报错. 2.无奈之下,只有选 ...

  6. App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file

    ios进行http请求,会出现这个问题: App Transport Security has blocked a cleartext HTTP (http://) resource load sin ...

  7. Mac Security工具使用总结

    Security是Mac系统中钥匙串和安全模块的命令行管理工具,(图形化工具为Keychain Access.app).钥匙串(Keychain)实质上就是一个用于存放证书.密钥.密码等安全认证实体的 ...

  8. iOS AFNetworking内存泄漏处理方法

    iOS AFN内存泄漏处理方法 细心的你是否也发现AFN的内存泄漏的问题了呢. 在这里给大家提供一个解决AFN内存泄漏的方法. 单例解决AFN内存泄漏 + (AFHTTPSessionManager ...

  9. MySQL5.7 修改密码

    MySQL5.7 修改密码 mysql> update mysql.user set authentication_string = password('新密码') where user='用户 ...

  10. TortoiseSVN和VisualSVN-Server的配置使用,外网访问SVN版本库

    TortoiseSVN和VisualSVN-Server的配置使用,外网访问SVN版本库 SVN客户端程序:TortoiseSVN SVN服务器程序:VisualSVN-Server ######## ...