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
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

收银系统源码-商城下单,门店接单

随着新零售时代的不断进步&#xff0c;线下线上一体化的收银系统&#xff0c;被很多门店越来越重视。用户在线上商城下单后&#xff0c;门店如何接单呢&#xff0c;如何处理订单呢&#xff1f; 1.收银系统开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后合管理网…

Linux云计算 |【第一阶段】ENGINEER-DAY2

主要内容&#xff1a; 磁盘空间管理fdisk、parted工具、开机自动挂载、文件系统、交换空间 KVM虚拟化 实操前骤&#xff1a; 1&#xff09;添加一块硬盘&#xff08;磁盘&#xff09;&#xff0c;需要关机才能进行操作&#xff0c;点击左下角【添加硬件】 2&#xff09;选择2…

【Linux】线程互斥和同步

目录 线程互斥 相关概念 互斥量mutex 互斥量的接口 初始化互斥量 销毁互斥量 互斥量加锁/解锁 可重入VS线程安全 概念 可重入与线程安全的联系 可重入与线程安全的区别 死锁 死锁的四个必要条件 避免死锁 避免死锁的算法 线程同步 条件变量 条件变量函数 初始…

WebRTC音视频-环境搭建

目录 期望效果 1:虚拟机和系统安装 2:WebRTC客户端环境搭建 2.1&#xff1a;VScode安装 2.2&#xff1a;MobaXterm安装 3:WebRTC服务器环境搭建 3.1&#xff1a;安装openssh服务器 3.2&#xff1a;安装Node.js 3.3&#xff1a;coturn穿透和转发服务器 3.3.1&a…

redis服务器同 redis 集群

搭建redis服务器 修改服务运行参数 常用命令常用命令 创建redis集群 准备做集群的主机&#xff0c;不允许存储数据、不允许设置连接密码 配置服务器&#xff1a; 1、在任意一台redis服务器上都可以执行创建集群的命令。 2、--cluster-replicas 1 给每个master服务器分配1台…

基于java的设计模式学习

PS &#xff1a;以作者的亲身来看&#xff0c;这东西对于初学者来说有用但不多&#xff0c;这些东西&#xff0c;更像一种经验的总结&#xff0c;在平时开发当中一般是用不到的&#xff0c;因此站在这个角度上用处不大。 1.工厂模式 1.1 简单工厂模式 我们把new 对象逻辑封装…

[图解]《分析模式》漫谈16-“我用的”不能变成“我的”

1 00:00:00,720 --> 00:00:02,160 今天&#xff0c;我们来说一下 2 00:00:02,170 --> 00:00:04,850 “我用的”不能变成“我的” 3 00:00:04,860 --> 00:00:11,390 《分析模式》的前言 4 00:00:12,260 --> 00:00:13,410 有这么一句话 5 00:00:14,840 --> 0…

增加、动态修改、批量删除

deptId插入部门号&#xff08;前端遍历部门表使用下拉框&#xff0c;选择部门名&#xff0c;后端存入对应的部门号&#xff09; 写更新字段时&#xff0c;可以写出所有字段&#xff0c;用动态SQL进行判断有没有 只有String类型的需要判断不等于空字符串&#xff0c;其他只需判…

P3-AI产品经理-九五小庞

AI产品的数据流向 美团外卖&#xff0c;实时只能调度 美团28分钟送达需求的分析 AI产品常用的算法 常用算法 常见的AI算法解析 自然语言生成NLG语音识别&#xff1a;科大讯飞&#xff0c;通义千问 虚拟现实机器学习平台 决策管理系统生物特征识别技术 RPA(机器人流程自动…

2008-2023年上市公司环境绩效、资源消耗及排放明细表数据

2008-2023年上市公司环境绩效、资源消耗及排放明细表数据 1、时间&#xff1a;2008-2023年 2、来源&#xff1a;上市公司社会责任报告&#xff0c;上市公司年报 3、指标&#xff1a;证券代码、证券简称、上市公司ID、统计截止日期、披露内容类型、项目名称、项目数值、单位 …

Arduino学习笔记1——IDE安装与起步

一、IDE安装 去浏览器直接搜索Arduino官网&#xff0c;点击Software栏进入下载界面&#xff0c;选择Windows操作系统&#xff1a; 新版IDE下载不需要提前勾选所下载的拓展包&#xff0c;下载好后直接点击安装即可。 安装好后打开Arduino IDE&#xff0c;会自动开始下载所需的…

3.3-LSTM的改进

文章目录 1改进点1.1多层化1.2 dropout1.2.1具体概念1.2.2应该插入到LSTM模型的哪里 1.3权重共享 2改进之后的LSTMLM的代码实现2.1初始化2.2前向计算2.3反向传播 3相应的学习代码的实现4总结 1改进点 1.1多层化 加深神经网络的层数往往能够学习更复杂的模式&#xff1b;因此这…

【转盘案例-弹框-修改Bug-完成 Objective-C语言】

一、我们来看示例程序啊 1.旋转完了以后,它会弹一个框,这个框,是啥, Alert 啊,AlertView 也行, AlertView,跟大家说过,是吧,演示过的啊,然后,我们就用iOS9来做了啊,完成了以后,我们要去弹一个框, // 弹框 UIAlertController *alertController = [UIAlertContr…

数据结构(栈)

文章目录 一、概念与结构 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶&#xff0c;另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压…

在qt的c++程序嵌入一个qml窗口

//拖拽一个QQuickWidget c端和qml通信的桥梁 找到qml的main.qml的路径 ui->quickWidget->setSource(QUrl::fromLocalFile("../../../code/main.qml"));// QML 与 Qt Widgets 通信//窗口就成了一个类实例对象pRoot (QObject*)ui->quickWidget->rootObje…

操作系统:408考研|王道|学习笔记

系列目录 计算机组成原理 学习笔记I 计算机组成原理 学习笔记II 目录 系列目录第1章 计算机系统概述1.1 操作系统的基本概念1.1_1 操作系统的定义、功能1.1_2 操作系统的特征 1.2 操作系统的发展与分类1.3 操作系统的运行环境&#x1f31f;1.3_1 操作系统的运行机制&#x1f3…

防溺水预警系统引领水域安全新篇章

一、系统概述 随着人们对水域活动的需求增加&#xff0c;溺水事故频发&#xff0c;给人们的生命安全带来了严重威胁。然而&#xff0c;如今&#xff0c;一项创新科技正在以强大的功能和无限的潜力引领着水域安全的新篇章。智能防溺水预警系统&#xff0c;作为一种集成了智能感知…

SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战

概览 在 SwiftUI 的开发过程中我们常说&#xff1a;“屏幕不够&#xff0c;滚动来凑”。可见滚动视图对于超长内容的呈现有着多么秉轴持钧的重要作用。 这不&#xff0c;从 SwiftUI 5.0&#xff08;iOS 17&#xff09;开始苹果又为滚动视图增加了全新的功能。但是官方的示例可…

不懂商业模式,没有互联网思维,不建议创业

在当今商业浪潮中&#xff0c;作为企业的掌舵人&#xff0c;若对商业模式缺乏深刻理解&#xff0c;确实容易陷入亏损与负债的困境&#xff0c;尤其是在互联网与创业领域。成功的企业往往建立在坚实的商业模式之上&#xff0c;这里我将为您概述五种关键模式&#xff0c;助力您把…