C# —— CRC16 算法

CRC16:即循环冗余校验码。数据通信当中一种常用的查错校验码

其特征信息字段和校验字段的长度可以是任意选定的,对数据进行指定多项式计算
并且将得到的结果附加在帧的后面,接受的设备也执行类似的算法,以保证数据传输的正确性和完整性

crc-16过程?

        1 初始化一个16位的寄存器地址 用作初始值
        2 遍历数据字节,从最高位到最低位,
        3 将数据字节与寄存器异或
        4 对寄存器进行8次迭代,每一次迭代将寄存器右移一位
        5 如果最低位位1,将寄存器与生成多项式0x8005异或,否则只进行右移操作
        6 重复上述步骤直到遍历完所有的字节
        7 最终寄存器的值就是crc16校验码
        8 crc计算之后高低位进行互换。

实例:

创建生成按钮

创建封装CRC方法

public static byte[] CRCCalc(byte[] data)  //[]
{//1 初始化一个16位的寄存器地址 用作初始值int crc = 0xffff;//2 遍历数据字节for(int i = 0; i < data.Length; i++){//3将数据字节与寄存器异或crc = crc ^ data[i];//4对寄存器进行8次迭代,每一次迭代将寄存器右移一位for(int j = 0; j < 8; j++){int temp;temp = crc & 1;crc = crc >> 1;//每一次迭代将寄存器右移一位crc = crc & 0x7fff;//5 如果最低位位1,将寄存器与生成多项式0x8005异或,否则只进行右移操作if (temp == 1){crc = crc ^ 0xa001;}crc = crc & 0xffff;}}byte[] crc16 = new byte[2];// crc寄存器的高低为进行互换crc16[1] =(byte)((crc>>8) & 0xff); //crc寄存器高八位变成了八低位crc16[0] = (byte)(crc & 0xff);// crc寄存器低八位变成了高低位return crc16;
}/// <summary>
/// CRC校验,参数为空格或逗号间隔的字符串
/// </summary>
/// <param name="data">校验数据,逗号或空格间隔的16进制字符串(带有0x或0X也可以),逗号与空格不能混用</param>
/// <returns>字节0是高8位,字节1是低8位</returns>
///"01 03 00 03 00 01"
public static byte[] CRCCalc(string data)
{//分隔符是空格还是逗号进行分类,并去除输入字符串中的多余空格IEnumerable<string> datac = data.Contains(",") ? data.Replace(" ", "").Replace("0x", "").Replace("0X", "").Trim().Split(',') : data.Replace("0x", "").Replace("0X", "").Split(' ').ToList().Where(u => u != "");List<byte> bytedata = new List<byte>();foreach (string str in datac){bytedata.Add(byte.Parse(str, System.Globalization.NumberStyles.AllowHexSpecifier));}byte[] crcbuf = bytedata.ToArray();//crc计算赋初始值return CRCCalc(crcbuf);
}/// <summary>
///  CRC校验,截取data中的一段进行CRC16校验
/// </summary>
/// <param name="data">校验数据,字节数组</param>
/// <param name="offset">从头开始偏移几个byte</param>
/// <param name="length">偏移后取几个字节byte</param>
/// <returns>字节0是高8位,字节1是低8位</returns>
public static byte[] CRCCalc(byte[] data, int offset, int length)
{byte[] Tdata = data.Skip(offset).Take(length).ToArray();return CRCCalc(Tdata);
}

验证校验码方法是否正确

private void button1_Click(object sender, EventArgs e)
{// 1 传递的是字节数组类型byte[] data = new byte[] { 0x01, 0x03, 0x00, 0x03, 0x00, 0x01 };byte[] crc =  CRCCalc16.CRCCalc(data);for (int i = 0;i < crc.Length; i++){Console.WriteLine(crc[i]); //十进制116 10  //16进制是74 0A}//2传递的字符串类型 byte[] crc1=   CRCCalc16.CRCCalc("01 03 00 03 00 01");for (int i = 0; i < crc1.Length; i++){Console.WriteLine(crc1[i]); //十进制116 10  //16进制是74 0A}//3传递是字节数组和 字节开始位置和结束位置byte[] crc2 = CRCCalc16.CRCCalc(data,0,data.Length);for (int i = 0; i < crc2.Length; i++){Console.WriteLine(crc2[i]); //十进制116 10  //16进制是74 0A}
}

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

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

相关文章

Laravel的魔法纽带:深入理解Eloquent ORM的关联(Relationships)

Laravel的魔法纽带&#xff1a;深入理解Eloquent ORM的关联&#xff08;Relationships&#xff09; 在Laravel的世界中&#xff0c;Eloquent ORM&#xff08;对象关系映射&#xff09;是连接数据库和应用程序代码的桥梁。通过Eloquent&#xff0c;你可以轻松地定义和管理数据库…

鸿蒙语言基础类库:【@system.configuration (应用配置)】

应用配置 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.i18n]和[ohos.intl]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import configurati…

数据库安装部署教程

数据库的安装部署教程因不同的数据库管理系统&#xff08;DBMS&#xff09;而异&#xff0c;以下将以MySQL、SQL Server和Oracle为例&#xff0c;分别概述其安装部署的基本步骤。请注意&#xff0c;由于软件版本和操作系统的不同&#xff0c;具体步骤可能会有所变化。 一、MyS…

CSS Modules:重构前端样式的未来?

在前端开发领域&#xff0c;CSS Modules 是近年来备受关注的一种样式解决方案&#xff0c;它改变了传统 CSS 的全局共享模式&#xff0c;引入了一种局部作用域的概念。这种变化不仅提升了样式的可维护性和可复用性&#xff0c;还促进了组件化开发的进一步成熟。本文将深入探讨 …

常见CSS属性

常见CSS属性。 1. display: 定义&#xff1a;display 属性控制元素如何渲染在文档流中&#xff0c;影响了元素是否占用空间、位置及盒子模型的行为。 使用说明&#xff1a;它可以设置为如block, inline, inline-block, flex, grid, none等值&#xff0c;用于决定元素显示模式…

云服务器实际内存与购买不足量问题

君衍 一、本篇缘由二、问题研究1、dmidecode2、dmesg | grep -i memory 三、kdump四、解决方案1、卸载kdump-tools2、清理依赖包3、修改配置文件4、重新生成配置文件5、重启服务器6、再次查看 一、本篇缘由 本篇由于最近买了云服务器&#xff0c;之前基本在本地使用VMware进行虚…

web自动化测试selenium的基本使用

目录 初始化浏览器并打开网页 定位网页元素 定位的方法 模拟键盘操作 模拟鼠标操作 xpath方法 xpath结点 路径表达式 轴 selenium是一个很流行的自动化测试的库&#xff0c;主要用于模拟浏览器的运行&#xff0c;是web应用测试的工具。 在使用selenium时&#xff0c;…

复变偏微分方程

复变偏微分方程是一类在复数域上定义的偏微分方程。这类方程在数学物理、工程学、流体力学等领域有着广泛的应用。复变函数理论为解决这类方程提供了强有力的工具。 ### 基本定义 复变偏微分方程通常涉及复数域上的函数 \( f(z, \bar{z}) \)&#xff0c;其中 \( z \) 是复变量…

网络安全----web安全防范

以下代码用来防范流行的DDoS攻击&#xff0c;ARP欺骗&#xff0c;CC攻击&#xff0c;XXS攻击&#xff0c;对输入的恶意代码进行过滤&#xff0c;嵌入到web程序可以很好的防范网络攻击&#xff0c;但如果想要更好的防范网络攻击&#xff0c;还需要更加复杂的配置和更硬核的硬件。…

(二)高并发压力测试调优篇——caffeine本地缓存调优

前言 在上一节内容中我们主要介绍了高并发请求下&#xff0c;mysql数据库的调优&#xff0c;其调优的主要原理是尽量减少数据库的IO操作&#xff0c;从而提高服务器的访问性能。在此基础上&#xff0c;本节内容是关于如何利用缓存&#xff0c;提高系统的并发访问能力。我们会首…

Linux部署禅道(无脑复制版)

目录 环境部署1、下载&#xff0c;解压2、启动3、设置开机自启 登录禅道登录数据库1、设置账号2、网页登录数据库 环境 Linux系统 Centos7 《Linux一键安装包安装禅道》视频链接&#xff1a; https://www.zentao.net/zentao-install/zentao-linux-install-80523.html 部署 …

谢启昆:乾隆年间的清廉典范与学术巨擘

谢启昆&#xff0c;一位生活在清朝乾隆年间的杰出人物&#xff0c;以其清廉的政绩和卓越的学术成就&#xff0c;成为后世效仿的典范。他的画像中&#xff0c;目光如炬&#xff0c;透露出坚毅与智慧的光芒&#xff0c;仿佛在诉说着他不平凡的一生。 谢启昆出生在一个书香门第&am…

蒙特卡洛采样

目录 蒙特卡洛采样的计算逻辑计算步骤&#xff1a;1. 定义问题2. 确定采样范围3. 生成随机样本点4. 计算函数值5. 估计期望值或积分值6. 计算误差 具体示例&#xff1a;1. 定义问题2. 确定采样范围3. 生成随机样本点4. 计算函数值5. 估计积分值6. 计算误差 总结 蒙特卡洛采样是…

《C++ Templetes》《1、函数模板》

文章目录 1、函数模板1.1 函数模板的简单示例&#xff1a;1.2 模板参数1.3 实参演绎实参演绎的概念实参演绎的过程注意事项示例 1.4 函数模板的重载 2、总结3、参考 在《 Effective C》中第一个建议就是&#xff0c;把C看作是一个语言的联邦&#xff0c;其中Templates在联邦中留…

多元统计分析概述

目录 1. 多元回归分析 2. 主成分分析&#xff08;PCA&#xff09; 3. 因子分析 4. 判别分析 5. 聚类分析 6. 多维尺度分析&#xff08;MDS&#xff09; 结论 多元统计分析是一组用于分析多个变量之间关系的统计方法。它广泛应用于各个领域&#xff0c;如市场研究、生物医…

华为OD机试D卷 --可以处理的最大任务数--24年OD统一考试(Java JS Python C C++)

文章目录 题目描述输入描述输出描述用例1题目解析java源码js源码c++源码题目描述 在某个项目中有多个任务(用task数组表示)需要你进行处理,其中: task[i] = [si, ei] 你可以在 si ≤ day ≤ ei 中的任意一天处理该任务,请返回你可以处理的最大任务数。 输入描述 第一行…

PHP webshell 免杀方法

本文介绍php类webshell简单的免杀方法&#xff0c;总结不一定全面&#xff0c;仅供读者参考。 webshell通常可分为一句话木马&#xff0c;小马&#xff0c;大马&#xff0c;内存马。 一句话木马是最简单也是最常见的webshell形式&#xff0c;这种木马体积小&#xff0c;隐蔽较…

a newer or same version is present nvidia解决方案

安装时候出现a newer or same version is present nvidia 或者Night Visual Editor 失败&#xff0c;把显卡驱动卸载掉&#xff0c;打开service.mtc 服务控制面板&#xff0c;把nvidia开头的服务全停掉&#xff0c;重新启动cuda安装程序选择自定义安装 vse visual studio相关的…

学懂C#编程:常用框架学习(三)——.NET Framework框架下的Entity Framework (EF)开发应用详解

目录 一、Entity Framework概述 二、Entity Framework的核心组成部分 Entity Data Model (EDM)&#xff1a; Entity Client&#xff1a; Object Services&#xff1a; ADO.NET Provider&#xff1a; 三、分层结构 应用程序层&#xff1a; Entity Framework层&#xff…