C# 实现CRC校验(循环冗余校验)CRC-8位/16位/32位等参数模型

本文介绍了如何在C#中实现CRC(循环冗余校验)算法,包括CRC-8、CRC-16和CRC-32等参数模型。通过引用特定库,展示了CRC校验的完整代码示例,并提供了自定义CRC参数模型的方法。同时,还列举了一些常见的CRC参数模型及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C# 实现CRC校验(循环冗余校验)CRC-8位/16位/32位等参数模型

什么是CRC

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

CRC算法参数模型

参数名解释
WIDTH宽度,即CRC比特数。
POLY生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
INIT这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
REFIN待测数据的每个字节是否按位反转,True或False。
REFOUT在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
XOROUT计算结果与此参数异或后得到最终的CRC值。

完整代码

引用库

右键单击项目,选择“管理NuGet程序包”。
在这里插入图片描述
搜索“ApeFree.CodePlus.Algorithm”并安装。
在这里插入图片描述

Demo

Demo中使用库中提供的四个常见的CRC参数模型和一个自定义的参数模型演示使用方法。

using ApeFree.CodePlus.Algorithm.CRC;

static class Program
{
	public static void Main()
	{
		// 测试数据
		var data = new byte[] {0x12, 0x34, 0x56, 0x78, 0x90 };

		// CRC-8
		{
			var crc = new Crc(CrcModel.CRC8);
			var result = crc.Calculate(data);
			Console.WriteLine(BitConverter.ToString(result));
		}

		// CRC-16/IBM
		{
			var crc = new Crc(CrcModel.CRC16_IBM);
			var result = crc.Calculate(data);
			Console.WriteLine(BitConverter.ToString(result));
		}

		// CRC-16/CCITT
		{
			var crc = new Crc(CrcModel.CRC16_CCITT);
			var result = crc.Calculate(data);
			Console.WriteLine(BitConverter.ToString(result));
		}

		// CRC-32
		{
			var crc = new Crc(CrcModel.CRC32);
			var result = crc.Calculate(data);
			Console.WriteLine(BitConverter.ToString(result));
		}

		// 自定义CRC参数模型
		{
			// CRC-16/MODBUS 参数模型
			// 宽度			16
			// 多项式		0x8005
			// 初始值		0xFFFF
			// 结果异或值		0x0000
			// 输入反转		true
			// 输出反转		true
			var cmCRC16Modbus = new CrcModel(16, 0x8005, 0xFFFF, 0x0000, true, true);

			var crc = new Crc(cmCRC16Modbus); 
			var result = crc.Calculate(data);
			Console.WriteLine(BitConverter.ToString(result));
		}
	}
}

使用其他CRC参数模型

库中预设了常见的CRC参数模型(宽度为8-64之间),通过CrcModel可查看。
在这里插入图片描述


常见的CRC参数模型

常见的CRC参数模型:
在这里插入图片描述


参考资料

  1. CRC(循环冗余校验)在线计算
  2. On-line CRC calculation and free library
1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。   2、生成CRC码的基本原理:任意一个由二进制串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。   3、CRC码集选择的原则:若设码字长度为N,信息字段为K校验字段为R(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得   V(x)=A(x)g(x)=xRm(x)+r(x);   其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,   g(x)称为生成多项式:   g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR   发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。   4、CRC校验码软件生成方法:   借助于多项式除法,其余数为校验字段。   例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1   假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001   x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;   采用多项式除法: 得余数为: 1010 (校验字段为:1010)   发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10   信息字段 校验字段   接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)   如果能够除尽,则正确,
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿长大人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值