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 效验算法的更多相关文章

  1. Java CRC16 MODBUS校验算法实现

    /** * CRC校验算法工具类 */ public class CRCUtil { public static String getCRC(String data) { data = data.re ...

  2. C++与JAVA代码实现CRC-16/MODBUS算法,且与 http://www.ip33.com/crc.html 进行结果验证

    CRC-16/MODBUS的多项式为:x16+x15+x2+1(8005),宽度为16.运算时,首先将一个16位的寄存器预置为11111111 11111111,然后连续把数据帧中的每个字节中的8位与 ...

  3. Modbus总线CRC16效验算法C语言

    unsigned short CRC16_Modbus ( unsigned char *pdata, int len){ unsigned short crc=0xFFFF; int i, j; f ...

  4. CRC16 三种算法及c实现

    标准CRC生成多项式如下表: 名称                     生成多项式                           简记式*                 标准引用   CR ...

  5. 【算法集中营】CRC16 三种算法及c实现

    标准CRC生成多项式如下表: 名称       生成多项式             简记式*  标准引用    CRC-4       x4+x+1                  3        ...

  6. C#和C实现通过CRC-16 (Modbus)获取CRC值并校验数据(代码)

    文章首发于浩瀚先森博客 CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验.它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差 ...

  7. C# CRC16 modbus

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. CRC-16 (Modbus)

    typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #defi ...

  9. 查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

随机推荐

  1. python--jinja2

    from jinja2 import Template # 创建一个Template模板去渲染它 s = "my name is {{mashiro}}" t = Template ...

  2. 学习SPRING BOOT, SPRING CLOUD之Eureka和security

    有意思,明天去杨浦报名了一个SPRING CLOUD沙龙, 今天再抓紧看看哈哈哈. Eureka服务端: EurekaApplication.java package com.packtpub.Eur ...

  3. Spring Cloud底层原理(转载 石杉的架构笔记)

    拜托!面试请不要再问我Spring Cloud底层原理 原创: 中华石杉 石杉的架构笔记   目录 一.业务场景介绍 二.Spring Cloud核心组件:Eureka 三.Spring Cloud核 ...

  4. luogu P1145 约瑟夫

    题目描述 n个人站成一圈,从某个人开始数数,每次数到m的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人.现在有一圈人,k个好人站在一起,k个坏人站在一起.从第一个好人开始数数.你要确定一个最小 ...

  5. [BZOJ 1806] Miners 矿工配餐

    Link: BZOJ 1806 传送门 Solution: 为了使状态包含每个节点前所有必须的信息: 设$dp[i][a1][a2][b1][b2]$为配送到第$i$个,一厂前两个为$a1,a2$,二 ...

  6. centos忘记密码,重新设置密码的方法

    (1)重新启动Centos,在启动过程中,长按“ESC”键,进入GNU GRUB界面. (2)选择要进入的系统,按“E”键(在启动之前编辑命令). (3)选择第二项操作系统的内核“kernel”,按& ...

  7. mtd-utils 及 ubi-utils 交叉编译

    参考: http://blog.csdn.net/zjjyliuweijie/article/details/7205374 NAND是嵌入式系统一个很重要的部件,而mtd-utilts中包含了很多针 ...

  8. ini配置文件在LINUX下面程序打不开?

    ini配置文件在LINUX下面程序打不开? 在WINDOWS里面编辑的INI配置文件保存时默认是ANSI字符编码,LINUX可能不识别,导致LINUX程序不能打开INI配置文件,成功读取里面的参数. ...

  9. 【Linux】CentOS7上安装搜狗输入法

    找到一篇资料,提供安装搜狗输入法的方法,在http://www.cnblogs.com/Yiutto/p/6204085.html[也是本文的参考原地址] 请大家自行下载fcitx.tar.gz 1. ...

  10. JAVA常见算法题(二十三)

    package com.xiaowu.demo; /** * 给一个不多于5位的正整数,要求:①求它是几位数:②逆序打印出各位数字. * * * @author WQ * */ public clas ...