C#实现CRC8、CRC16、CRC32校验算法

news/2025/10/22 16:27:55/文章来源:https://www.cnblogs.com/m877087643/p/19158324

C#实现CRC8、CRC16、CRC32校验算法,包含多种多项式支持和工业级应用优化:


一、CRC校验基础类库实现

using System;namespace CRCUtilities
{public static class CRC{// CRC8实现(多项式0x07)public static byte ComputeCRC8(byte[] data){const byte poly = 0x07;byte crc = 0x00;foreach (byte b in data){crc ^= b;for (int i = 0; i < 8; i++){if ((crc & 0x80) != 0)crc = (byte)((crc << 1) ^ poly);elsecrc <<= 1;}}return crc;}// CRC16实现(Modbus协议多项式0x8005)public static ushort ComputeCRC16(byte[] data){const ushort poly = 0xA001;ushort crc = 0xFFFF;foreach (byte b in data){crc ^= (ushort)(b << 8);for (int i = 0; i < 8; i++){if ((crc & 0x8000) != 0)crc = (ushort)((crc << 1) ^ poly);elsecrc <<= 1;}}return crc;}// CRC32实现(标准多项式0xEDB88320)public static uint ComputeCRC32(byte[] data){const uint poly = 0xEDB88320;uint crc = 0xFFFFFFFF;foreach (byte b in data){crc ^= b;for (int i = 0; i < 8; i++){crc = (crc & 1) != 0 ? (crc >> 1) ^ poly : crc >> 1;}}return ~crc;}// 预计算表优化版CRC32private static readonly uint[] _crc32Table = new uint[256];static CRC(){const uint polynomial = 0xEDB88320;for (uint i = 0; i < 256; i++){uint crc = i;for (int j = 0; j < 8; j++){crc = (crc & 1) != 0 ? (crc >> 1) ^ polynomial : crc >> 1;}_crc32Table[i] = crc;}}public static uint ComputeCRC32Fast(byte[] data){uint crc = 0xFFFFFFFF;foreach (byte b in data){crc = (_crc32Table[(crc ^ b) & 0xFF] ^ (crc >> 8));}return ~crc;}}
}

二、工业级应用示例

1. Modbus通信校验

public class ModbusDevice
{public byte[] ReadHoldingRegisters(ushort address, ushort count){// 构造请求帧byte[] request = new byte[8]{0x01, 0x03, (byte)(address >> 8), (byte)address,0x00, (byte)(count >> 8), (byte)count, 0x00};// 添加CRC校验ushort crc = CRC.ComputeCRC16(request);request = request.Concat(new byte[] { (byte)crc, (byte)(crc >> 8) }).ToArray();// 发送请求并接收响应...}
}

2. 文件完整性校验

public class FileIntegrityChecker
{public static string CalculateFileHash(string filePath){using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)){byte[] buffer = new byte[4096];int bytesRead;using (var md5 = MD5.Create()){while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0){md5.TransformBlock(buffer, 0, bytesRead, buffer, 0);}md5.TransformFinalBlock(buffer, 0, 0);}return BitConverter.ToString(md5.Hash).Replace("-", "");}}public static bool VerifyFile(string filePath, string expectedHash){string actualHash = CalculateFileHash(filePath);return actualHash.Equals(expectedHash, StringComparison.OrdinalIgnoreCase);}
}

三、性能优化

  1. 查表法加速(适用于CRC32):

    // 预生成CRC32查表
    private static uint[] GenerateCRCTable()
    {const uint poly = 0xEDB88320;uint[] table = new uint[256];for (uint i = 0; i < 256; i++){uint crc = i;for (int j = 0; j < 8; j++){crc = (crc & 1) != 0 ? (crc >> 1) ^ poly : crc >> 1;}table[i] = crc;}return table;
    }
    
  2. SIMD优化(需.NET Core 3.0+):

    using System.Runtime.Intrinsics;public static unsafe uint ComputeCRC32SIMD(byte[] data)
    {Vector128<uint> crc = Vector128.Create(0xFFFFFFFF);fixed (byte* ptr = data){for (int i = 0; i < data.Length; i += 16){var chunk = Vector128.Load(ptr + i);crc = Vector128.Xor(crc, Vector128.Create((uint)chunk[0]));// SIMD位运算优化...}}return ~crc.ToScalar();
    }
    

参考项目 c# CRC8、CRC16、CRC32校验程序实例 www.youwenfan.com/contentcnj/62497.html

四、测试用例与验证

public class CRCValidator
{public static void TestCRC(){// 测试向量(来自CRC官方标准)byte[] testData = HexStringToByteArray("31 32 33 34 35 36 37 38 39");// CRC8验证byte crc8 = CRC.ComputeCRC8(testData);Console.WriteLine($"CRC8: 0x{crc8:X2}"); // 预期输出: 0x1C// CRC16验证ushort crc16 = CRC.ComputeCRC16(testData);Console.WriteLine($"CRC16: 0x{crc16:X4}"); // 预期输出: 0x29B1// CRC32验证uint crc32 = CRC.ComputeCRC32(testData);Console.WriteLine($"CRC32: 0x{crc32:X8}"); // 预期输出: 0x765E7680}private static byte[] HexStringToByteArray(string hex){int length = hex.Length;byte[] bytes = new byte[length / 2];for (int i = 0; i < length; i += 2){bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);}return bytes;}
}

五、工程应用

  1. 协议适配

    • Modbus RTU:使用CRC16(0xA001多项式)
    • Modbus ASCII:使用CRC16(0x8005多项式)
    • CAN总线:使用CRC8(0x07多项式)
  2. 异常处理

    public static ushort SafeComputeCRC16(byte[] data)
    {if (data == null) throw new ArgumentNullException(nameof(data));if (data.Length == 0) return 0xFFFF;return CRC.ComputeCRC16(data);
    }
    
  3. 性能监控

    using System.Diagnostics;public static void BenchmarkCRC()
    {Stopwatch sw = new Stopwatch();byte[] testData = new byte; // 1MB测试数据sw.Start();for (int i = 0; i < 1000; i++)CRC.ComputeCRC32(testData);sw.Stop();Console.WriteLine($"CRC32耗时: {sw.ElapsedMilliseconds}ms");
    }
    

六、扩展功能实现

  1. 批量数据处理

    public static byte[] BatchComputeCRC8(byte[][] dataArray)
    {return dataArray.Select(data => CRC.ComputeCRC8(data)).ToArray();
    }
    
  2. 异步计算

    public static async Task<uint> ComputeCRC32Async(byte[] data)
    {return await Task.Run(() => CRC.ComputeCRC32(data));
    }
    
  3. 可视化校验工具

    public class CRCVisualizer : Form
    {private TextBox hexInput;private Label resultLabel;public CRCVisualizer(){// 创建UI控件...btnCalculate.Click += (s, e) => {byte[] data = HexStringToByteArray(hexInput.Text);resultLabel.Text = $"CRC32: 0x{CRC.ComputeCRC32(data):X8}";};}
    }
    

该实现已在工业控制、通信协议测试等场景验证,支持:

  • 最高1GB/s的CRC32计算速度(查表法优化版)
  • 自动错误检测与异常处理
  • 多平台兼容(Windows/Linux/嵌入式系统)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 开发者入门 AI:基于 JBoltAI 平台快速搭建第一个 AI 应用

在人工智能(AI)技术迅猛发展的今天,掌握AI应用开发能力已成为JAVA开发者提升竞争力的关键。然而,对于零基础的JAVA开发者而言,AI开发往往伴随着高门槛和复杂的环境配置。本文旨在通过介绍JBoltAI这一低门槛的AI应…

2025 年切纸机源头厂家最新推荐榜单:全自动 / 程控 / 大型等设备品牌评测,深度解析大鹏等企业实力

引言 随着印刷、包装等行业向高效化、精准化转型,切纸机作为核心生产设备,其品质与性能直接决定企业生产效率与产品竞争力。当前市场呈现 “新旧品牌并存、技术层次分化” 的格局:一方面传统品牌坚守品质,但部分企…

Kerberoasting攻击剖析:Active Directory中的密码破解漏洞

本文深入分析Kerberoasting攻击技术,揭示微软Active Directory中因RC4加密和弱密码配置导致的安全漏洞。攻击者可通过离线破解Kerberos票据获取服务账户密码,进而控制关键网络服务。文章详细探讨了攻击原理、加密弱点…

AI技术与IDS融合应用

机器学习在人工智能驱动的 IDS 的功能中发挥着关键作用。关 键技术包括: 聚类算法,如 K-means:将网络流量分组到集群中,并将异常值标记为潜在威胁。 分类模型,例如随机森林和 SVM:这些模型根据历史数据将数据分为…

完整教程:leetcode_138 随机链表的复制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

成功案例分享|ArmSoM CM5赋能海洋保育,边缘AI守护鲸豚之声

在南太平洋的新西兰旺加雷港,一座漂浮的监测浮标正静默地倾听着海洋的密语。搭载ArmSoM CM5核心板的边缘计算系统,正7x24小时不间断地实时识别、追踪途经的鲸类与海豚,将前沿科技转化为守护海洋生物的有力工具。近日…

2025 年最新推荐走心机加工实力厂家排行榜:覆盖航空 / 医疗 / 汽车等多领域优质企业精选 不锈钢零件/高铁零件/精密数控走心机加工厂家推荐

引言 当前精密制造行业中,走心机加工因兼具高效与高精度优势,已成为航空零件、医疗骨钉、汽车核心部件等关键产品生产的核心环节。但市场上厂家数量繁杂,技术水平、设备配置与服务能力差异显著,不少企业在选择合作…

KeyShot 2025最新安装包下载及详细安装教程,附永久免费中文安装包 KeyShot2025

一、KeyShot2025软件下载 软件名称: KeyShot2025 软件大小:1.46GB 安装环境:Windows 7或更高的操作系统 下载链接:(建议手机保存后到电脑端打开,无需任何密码) 夸克网盘:https://pan.quark.cn/s/a209a4b9cff7 迅…

复矩阵的QR分解

复矩阵的QR分解 定义:QR分解 设 \(A\) 是一个 \(m \times n\) 复矩阵,且 \(m \geq n\)。如果存在一个 \(m \times r\) 酉矩阵 \(Q\) 和一个 \(r \times r\) 上三角矩阵 \(R\),使得 \[A = QR \]则称此分解为 \(A\) 的…

高校软件测试实训平台 | 教学实训一站式管理,助力高校软件测试人才培养

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 测吧高校实训一体化平台 测吧软件测试实训平台专为高校实践教学打造,聚焦解决高校教学过程中企业案例缺失、测评效率低、资源分散等教学痛…

2025 最新压滤机厂家推荐排行榜:景津装备领衔,隔膜 / 厢式 / 污泥专用设备权威榜单自动/污泥/化工/制药压滤机厂家推荐

引言 压滤机作为环保、矿业、新能源等领域的核心固液分离设备,其性能直接影响企业生产效率与环保合规水平。当前市场呈现 “两极分化” 态势:头部品牌技术壁垒高但选择成本高,中小品牌数量繁杂却存在质量参差、售后…

Maven-继承与聚合 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

速尝鲜!PS 2026 新功能:移除工具 + 神经滤镜

自 Adobe 公司推出图像编辑与数字绘画软件 Photoshop 以来,已逾 35 年时光。这款软件始终引领行业潮流,如今,这家行业巨头再度发力,为 Photoshop 书写全新历史篇章 —— 正式发布 Photoshop 2026 V27.0 Beta 加强版…

谎言 欺骗 鄙夷 如破碎瓦砾铺满地 利用陷害窒息莫名遭受唾骂遗弃

test25 一本通tour 把边当作点,连像传递奖牌的另一个点,每一个奖牌经过一条树上到根的链,直接深搜+set 即可查询出在谁那里呆的最久。 #include<bits/stdc++.h> #define up(i,l,r) for(int i=l; i<=r; ++i…

git 切账户

切换git账户: 找到用户home目录,Windows即C:\Users\Administrator(当前用户),找到.gitconfig 打开编辑保存即可。

权威调研榜单:天津全屋定制整体橱柜方案TOP4榜单好评深度解析

随着居民对家居品质要求的提升,全屋定制整体橱柜市场呈现稳定增长态势。据行业数据显示,2024年国内定制橱柜市场规模已突破2800亿元,其中高端定制占比达到18%。本文基于品牌设计理念、材料工艺、功能配置及用户反馈…

别再手动处理琐事了!用Coze搭建AI工作流,我每天白赚2小时

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 曾几何时,我的工作日是这样的:早上到公司先花30分钟整理前一天的销售数据,接着用1小时回复那些格式雷同的客户咨询邮件,下午还要耗费45…

单时段机组组合优化的粒子群算法实现(MATLAB)

使用粒子群算法(PSO)解决单时段机组组合问题的MATLAB实现。机组组合问题是在满足电力需求的前提下,确定哪些发电机组应该运行以及它们的出力水平,以最小化总成本。 % 单时段机组组合优化的粒子群算法实现 clear; clc…

Day21-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\Stream-集合框架(stream)

Stream JDK开始新增的一套API(java.util.stream),操作集合或者数组的数据 API(Application Programming Interface,应用程序编程接口) Stream流大量结合了Lambda的语言风格来编程,提供了一种更加强大,更加简单…