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参数模型: