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,一经查实,立即删除!

相关文章

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

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

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

君衍 一、本篇缘由二、问题研究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;…

(二)高并发压力测试调优篇——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…

多元统计分析概述

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

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相关的…

鸿蒙语言基础类库:【@system.device (设备信息)】

设备信息 说明&#xff1a; 从API Version 6开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.deviceInfo]进行设备信息查询。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import dev…

手把手教你,如何利用积木易搭3D扫描仪完成文物三维建模?

当前&#xff0c;文物三维建模主要技术手段主要有摄影测量技术、三维激光扫描技术、结构光扫描技术。其中&#xff0c;积木易搭的MagicScan作为一款先进的3D扫描仪&#xff0c;是正是运用了结构光扫描技术的精髓&#xff0c;它巧妙地融合了点云相机的高精度空间数据采集能力、纹…

如何用python写接口

如何用python写接口&#xff1f;具体步骤如下&#xff1a;  1、实例化server 2、装饰器下面的函数变为一个接口 3、启动服务 开发工具和流程&#xff1a; python库&#xff1a;flask 》实例化server&#xff1a;server flask.Flask(__name__) 》server.route(/index,met…

【STM32嵌入式系统设计与开发---拓展】——1_9 GPIO的输入和输出

这里写目录标题 0、输入 输出1、输出&#xff08;1&#xff09;GPIO_SetBits:用于设置 GPIO 引脚的状态&#xff08;即将指定的引脚设置为高电平&#xff09; 2、输入&#xff08;1&#xff09;GPIO_ReadInputDataBit&#xff08;&#xff09; 0、输入 输出 咋们定义了一个结构…

解决ESLint和Prettier冲突的问题

在配置了ESLint的项目中使用Prettier进行格式化可能会出现冲突&#xff0c;不如Prettier配置了使用双引号&#xff0c;ESLint配置了单引号&#xff0c;当然可以一个一个改成一样的配置&#xff0c;但是比较麻烦。我发现可以直接使用ESLint的规则进行格式化。在VSCode配置过程如…

xss复习总结及ctfshow做题总结xss

xss复习总结 知识点 1.XSS 漏洞简介 ​ XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从而达到恶意攻击用户的…

软考从报考到拿到证书的过程

一、报考阶段及参加考试阶段 这个阶段可以留意软考官网的的信息&#xff0c;一般上半年是3月份报名、5月份考试&#xff1b;下半年是8月份报名、11月份考试。以下是这个阶段会用到的链接&#xff0c;保持关注就好。 软考官网&#xff1a;中国计算机技术职业资格网 (ruankao.o…

六、 SpringBoot 配置⽂件 ★ ✔【value的引号注意事项、@ConfigurationProperties 、】

六、 SpringBoot 配置⽂件 本节⽬标1. 配置⽂件作⽤2. 配置⽂件快速⼊⼿3. 配置⽂件的格式4. properties 配置⽂件说明4.1 properties 基本语法4.2 读取配置⽂件4.3 properties 缺点分析 5. yml 配置⽂件说明5.1 yml 基本语法5.2 yml 使⽤进阶5.2.1 yml 配置不同数据类型及 nul…

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器&#xff0c;它是用来监测硬件或软件的故障的&#xff1b;它的工作原理大概就是开启后内部定时器会按照设置的频率更新&#xff0c;在程序运行过程中我们需不断地重装载看门狗&#xff0c;以使它不溢出&#xff1b;如果硬件或软件发生…

Vue实现滚动元素始终固定在最底部

1. 应用场景——聊天 在聊天的时候&#xff0c;展示聊天内容的元素是可以滚动的&#xff0c;通过上下滚动来查看过往消息。不过在首次打开聊天页面以及发送新消息时需要固定在滚动的最底部以及时展示最新的消息&#xff0c;这样才能获得比较好的用户体验。 效果&#xff1a; …