C#CRC16 Modbus 效验算法
CRC校验(循环冗余校验)小知识
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC算法参数模型解释:
NAME:参数模型名称。
WIDTH:宽度,即CRC比特数。
POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
REFIN:待测数据的每个字节是否按位反转,True或False。
REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
XOROUT:计算结果与此参数异或后得到最终的CRC值。
CRC16 Modbus主要实现方法
/// <summary>
/// CRC16_Modbus效验
/// </summary>
/// <param name="byteData">要进行计算的字节数组</param>
/// <returns>计算后的数组</returns>
public static byte[] ToModbus(byte[] byteData)
{
byte[] CRC = new byte[]; UInt16 wCrc = 0xFFFF;
for (int i = ; i < byteData.Length; i++)
{
wCrc ^= Convert.ToUInt16(byteData[i]);
for (int j = ; j < ; j++)
{
if ((wCrc & 0x0001) == )
{
wCrc >>= ;
wCrc ^= 0xA001;//异或多项式
}
else
{
wCrc >>= ;
}
}
} CRC[] = (byte)((wCrc & 0xFF00) >> );//高位在后
CRC[] = (byte)(wCrc & 0x00FF); //低位在前
return CRC; }
/// <summary>
/// CRC16_Modbus效验
/// </summary>
/// <param name="byteData">要进行计算的字节数组</param>
/// <param name="byteLength">长度</param>
/// <returns>计算后的数组</returns>
public static byte[] ToModbus(byte[] byteData, int byteLength)
{
byte[] CRC = new byte[]; UInt16 wCrc = 0xFFFF;
for (int i = ; i < byteLength; i++)
{
wCrc ^= Convert.ToUInt16(byteData[i]);
for (int j = ; j < ; j++)
{
if ((wCrc & 0x0001) == )
{
wCrc >>= ;
wCrc ^= 0xA001;//异或多项式
}
else
{
wCrc >>= ;
}
}
} CRC[] = (byte)((wCrc & 0xFF00) >> );//高位在后
CRC[] = (byte)(wCrc & 0x00FF); //低位在前
return CRC; }
CRC16 Modbus(LSB-MSB)通讯中校验字节格式为LSB-MSB,扩展方法可以忽略。
注意:MODBUS 通讯中校验字节格式为LSB-MSB,即低字节在前。
/// <summary>
/// CRC16_LSB-MSB效验
/// </summary>
/// <param name="byteData">要进行计算的字节数组</param>
/// <returns>计算后的数组</returns>
public static byte[] ToMsbLsb(byte[] byteData)
{
byte[] CRC = new byte[];
byte[] crcSwtich = new byte[];
CRC = ToModbus(byteData); crcSwtich[] = CRC[]; //高位在后
crcSwtich[] = CRC[]; //低位在前 return crcSwtich;
}
常见CRC参数模型如下:
| CRC算法名称 | 多项式公式 | 宽度 | 多项式 | 初始值 | 结果异或值 | 输入值反转 | 输出值反转 |
|---|---|---|---|---|---|---|---|
| CRC-4/ITU | x4 + x + 1 | 4 | 03 | 00 | 00 | true | true |
| CRC-5/EPC | x4 + x3 + 1 | 5 | 09 | 09 | 00 | false | false |
| CRC-5/ITU | x5 + x4 + x2 + 1 | 5 | 15 | 00 | 00 | true | true |
| CRC-5/USB | x5 + x2 + 1 | 5 | 05 | 1F | 1F | true | true |
| CRC-6/ITU | x6 + x + 1 | 6 | 03 | 00 | 00 | true | true |
| CRC-7/MMC | x7 + x3 + 1 | 7 | 09 | 00 | 00 | false | false |
| CRC-8 | x8 + x2 + x + 1 | 8 | 07 | 00 | 00 | false | false |
| CRC-8/ITU | x8 + x2 + x + 1 | 8 | 07 | 00 | 55 | false | false |
| CRC-8/ROHC | x8 + x2 + x + 1 | 8 | 07 | FF | 00 | true | true |
| CRC-8/MAXIM | x8 + x5 + x4 + 1 | 8 | 31 | 00 | 00 | true | true |
| CRC-16/IBM | x6 + x5 + x2 + 1 | 16 | 8005 | 0000 | 0000 | true | true |
| CRC-16/MAXIM | x6 + x5 + x2 + 1 | 16 | 8005 | 0000 | FFFF | true | true |
| CRC-16/USB | x6 + x5 + x2 + 1 | 16 | 8005 | FFFF | FFFF | true | true |
| CRC-16/MODBUS | x6 + x5 + x2 + 1 | 16 | 8005 | FFFF | 0000 | true | true |
| CRC-16/CCITT | x6 + x2 + x5 + 1 | 16 | 1021 | 0000 | 0000 | true | true |
| CRC-16/CCITT-FALSE | x6 + x2 + x5 + 1 | 16 | 1021 | FFFF | 0000 | false | false |
| CRC-16/x5 | x6 + x2 + x5 + 1 | 16 | 1021 | FFFF | FFFF | true | true |
| CRC-16/XMODEM | x6 + x2 + x5 + 1 | 16 | 1021 | 0000 | 0000 | false | false |
| CRC-16/DNP | x6 + x3 + x2 + x1 + x0 + x8 + x6 + x5 + x2 + 1 | 16 | 3D65 | 0000 | FFFF | true | true |
| CRC-32 | x2 + x6 + x3 + x2 + x6 + x2 + x1 + x0 + x8 + x7 + x5 + x4 + x2 + x + 1 | 32 | 04C11DB7 | FFFFFFFF | FFFFFFFF | true | true |
| CRC-32/MPEG-2 | x32 + x6 + x3 + x2 + x6 + x2 + x1 + x0 + x8 + x7 + x5 + x4 + x2 + x + 1 | 32 | 04C11DB7 | FFFFFFFF | 00000000 | false | false |
C#CRC16 Modbus 效验算法的更多相关文章
- Java CRC16 MODBUS校验算法实现
/** * CRC校验算法工具类 */ public class CRCUtil { public static String getCRC(String data) { data = data.re ...
- C++与JAVA代码实现CRC-16/MODBUS算法,且与 http://www.ip33.com/crc.html 进行结果验证
CRC-16/MODBUS的多项式为:x16+x15+x2+1(8005),宽度为16.运算时,首先将一个16位的寄存器预置为11111111 11111111,然后连续把数据帧中的每个字节中的8位与 ...
- Modbus总线CRC16效验算法C语言
unsigned short CRC16_Modbus ( unsigned char *pdata, int len){ unsigned short crc=0xFFFF; int i, j; f ...
- CRC16 三种算法及c实现
标准CRC生成多项式如下表: 名称 生成多项式 简记式* 标准引用 CR ...
- 【算法集中营】CRC16 三种算法及c实现
标准CRC生成多项式如下表: 名称 生成多项式 简记式* 标准引用 CRC-4 x4+x+1 3 ...
- C#和C实现通过CRC-16 (Modbus)获取CRC值并校验数据(代码)
文章首发于浩瀚先森博客 CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验.它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差 ...
- C# CRC16 modbus
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- CRC-16 (Modbus)
typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #defi ...
- 查表法计算CRC16校验值
CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...
随机推荐
- 为什么32位系统最大支持4G内存??我自己悟出来了 终于 。。。。。
今天突然开窍了,想通了..... 以下是我的抽象想法: 32位系统 这个 多少位 指的是 硬件的 一次性发送过来的位数,一个字节 等于8位,内存的一个存储单元就是一个字节,即8位. 也可以这样来想这个 ...
- Laravel5.1忽略Csrf验证的方法
在/App/Http/middleware/VerifyCsrfToken.php 文件的protected $except里面加入路由地址
- Javascript"怪异"现象
下面给大家看个例子,这个毫无疑问打印出10 var a = 10; function test() { console.log(a); } test(); 下面我改动一下 var a = 10; fu ...
- Java IO 学习(六)Java的Direct Memory与IO
ByteBuffer的源码中有这样一段注释: A byte buffer is either direct or non-direct. Given a direct byte buffer, the ...
- C/C++框架和库 (真的很强大) 转
http://blog.csdn.net/xiaoxiaoyeyaya/article/details/42541419 值得学习的C语言开源项目 - 1. Webbench Webbench ...
- 字母数字、字母、汉字验证码 (java)
原文:http://blog.csdn.net/qh_java/article/details/49854477 一.字母数字,字母,汉字验证码的生成代码 1.字母数字验证码: package com ...
- mysql查询一个库中有多少张表
SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES WHERE table_schema = 'palm_2_0_ ...
- docer中运行crontab
1 安装 sudo apt-get install cron 2 启动 start cron 3 列出所有本机启动crontab任务 ls -l /etc/init.d 列出所有自建cron任务 ...
- 【TCP/IP】IP路由选择
IP层在内存中有一个路由表,当有数据要发送时.它要对该表进行一次搜索以确认转发地址.收到的数据到达IP层时,IP层会检查数据报的目的地址是否为本机IP或广播IP: 假设是.就依据IP首部协议字段的协议 ...
- 分享三个USB抓包软件---Bus Hound,USBlyzer 和-USBTrace
Bus Hound官方下载地址:http://perisoft.net/bushound/Bus Hound 简易使用手册:bus_hound5.0中文使用说明.pdf (246 K) 下载次数:9 ...