C# —— CRC16 算法

news2024/11/23 11:54:59

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.coloradmin.cn/o/1937519.html

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

相关文章

ELK日志收集

一、什么是ELK ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体&#xff0c;ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案。 ELK 的好处&#xff1a; ELK 组件在大数据运维系统中&#xff0c;主要可解决的问题如下&…

录取查询老师在哪里制作?

随着考试的落幕&#xff0c;家长们焦急等待的心情终于可以稍微缓解&#xff0c;因为录取结果即将揭晓。然而&#xff0c;对于老师来说&#xff0c;这仅仅是另一项繁重工作的开始。他们需要将每一份录取通知单逐一发送给学生家长&#xff0c;这个过程不仅耗时而且容易出错。面对…

基于SSM的高考志愿选择辅助系统

基于SSM的高考志愿选择辅助系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台 前台首页 院校展示 后台 后台首页 学校管理 摘要 随着高考制度的不断完…

数据结构 day4

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

C语言 ——— 浮点数类型 在 内存中 的 存储模式

目录 浮点数存储规则 单\双精度浮点数 存储 S、M、E 的布局 有效数字M 和 指数位E 的特殊规定 浮点数在内存中是否存储的S、M、E 浮点数存储规则 根据国际标准IEEE754&#xff08;电气和电子工程协会&#xff09;规定&#xff1a;任意一个 浮点数F的二进制 都可以表示成…

19集 两款ESP32开发板如何选择?-《MCU嵌入式AI开发笔记》

19集 两款ESP32开发板我们用哪款&#xff1f;-《MCU嵌入式AI开发笔记》 有两款ESP32的开发板分别是ESP32 S3 和C3的&#xff0c;我们该如何选择&#xff1f; 1、ESP32-S3-BOX-3 在乐鑫官网上&#xff0c;https://www.espressif.com.cn/zh-hans/products/devkits 有ESP32S3 B…

Unity UGUI 之 Canvas画布

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.UGUI是什么 首先官方手册导向了这两个连接&#xff0c;里面是ugui的基本教程 帆布 |U…

【全面升级!短视频运营利器揭秘】短视频矩阵系统

短视频矩阵通常是指一种内容分发策略&#xff0c;它通过构建一个包含多种不同类型、主题或风格短视频的内容平台架构。这个矩阵可能会包括搞笑、教育、音乐、美食、旅游等各种短视频形式&#xff0c;让用户可以根据兴趣选择观看。每个视频可以视为矩阵中的一个节点&#xff0c;…

JVM-垃圾回收与内存分配

目录 垃圾收集器与内存分配策略 引用 对象的访问方式有哪些?&#xff08;句柄和直接指针&#xff09; Java的引用有哪些类型? 如何判断对象是否是垃圾? 请列举一些可作为GC Roots的对象? 对象头了解吗? mark word&#xff08;hashcode、分代、锁标志位&#xff09;、…

Linux 12:多线程2

1. 生产者消费者模型 生产者消费者模型有三种关系&#xff0c;两个角色&#xff0c;一个交易场所。 三种关系&#xff1a; 生产者之间是什么关系?竞争 - 互斥 消费者和消费者之间?竞争 - 互斥 消费者和消费者之间?互斥和同步 两个角色&#xff1a; 生产者和消费者 一个交…

记录|C# winform布局学习

目录 前言一、自适应布局Step1. 添加AutoAdaptWindowsSize类Step2. Form中引用Step3. 创建SizeChanged事件函数Step4. 在Fram.Disiger中添加 更新时间 前言 参考视频&#xff1a; C#5分钟winform快速自适应布局 参考文章&#xff1a; 其他参考&#xff1a; 写这篇文章&#xff…

【python学习】python的知识点总结、特点和思考及解答(代码示例)

引言 python 是一种高级编程语言&#xff0c;具有简洁的语法和丰富的库&#xff0c;被广泛应用于Web开发、数据分析、人工智能、科学计算等领域 文章目录 引言一、python知识点总结1.1 基础语法1.1.1 变量和数据类型1.1.2 控制结构1.1.3 函数和模块 1.2 面向对象编程1.2.1 类和…

vue的三大核心知识点

响应式&#xff1a; 监听data属性getter setter(包括数组)模板编译&#xff1a; 模板到render函数再到vnodevdom&#xff1a; patch(elem, vnode)和patch(vnode, newVnode) vue组件初次渲染过程 解析模板为render函数&#xff08;或在开发环境已完成&#xff0c;vue-loader&a…

Vue 对接海康威视,实现摄像头画面展示

文章目录 需求分析1. 下载2. 安装3. new 一个WebControl 插件相关实例 需求 项目中集成海康威视&#xff0c;实现摄像头画面展示 分析 1. 下载 传送门&#xff1a;官方插件包和文档下载 2. 安装 &#xff08;1&#xff09;下载完成后打开 &#xff08;2&#xff09;在项…

三款知名的基于RAG技术的智能体平台分析

这篇文章是关于目前市面上三款知名的基于检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术的智能体平台的详细对比分析。这三款产品分别是FastGPT、Dify和Coze。文章从不同维度分析了这些产品的优势和劣势&#xff0c;以供读者参考。 什么是RAG&…

【Qt之·类QRandomGenerator】

系列文章目录 文章目录 前言一、概述1.2. 二、实例演示总结 前言 一、概述 1. 2. 二、实例演示 示例1&#xff1a; #include <QRandomGenerator> #include <QRandomGenerator64> #include <QDebug>int randomInt QRandomGenerator::global()->bound…

ESP8266模块(2)

实例1 查看附近的WiFi 步骤1&#xff1a;进入AT指令模式 使用USB转串口适配器将ESP8266模块连接到电脑。打开串口终端软件&#xff0c;并设置正确的串口和波特率&#xff08;通常为115200&#xff09;。输入以下命令并按回车确认&#xff1a; AT如果模块响应OK&#xff0c;…

TCP状态转换详解

1.什么是TCP的状态转换 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中&#xff0c;连接的状态会随着不同阶段的通信而发生变化&#xff0c;这些变化被称为状…

数据库最佳实践:优化爬虫管理的数据存储方案

摘要&#xff1a; 面对日益增长的数据抓取需求&#xff0c;如何高效管理和存储爬虫获取的海量信息成为一大挑战。本文将深入探讨数据库最佳实践&#xff0c;揭示如何通过优化策略提升爬虫数据存储效率&#xff0c;助您跨越数据管理的障碍&#xff0c;实现数据价值最大化。 一、…

虚拟试衣人像合成新SOTA!IMAGDressing-v1:ControlNet和IP-Adapter的最佳拍档

文章链接&#xff1a;https://arxiv.org/pdf/2407.12705 github链接&#xff1a;https://imagdressing.github.io/ Demo试用&#xff1a;https://sf.dictdoc.site/ 亮点直击 为商家引入了一项新的虚拟试衣&#xff08;VD&#xff09;任务&#xff0c;并设计了一个综合亲和力测量…