crc校验

2023-05-16

参考链接:https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html

一、CRC校验原理

1.CRC校验全称为循环冗余校验(Cyclic Redundancy Check, CRC)。它是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,利用除法及余数的原理来作错误侦测,主要用来检测或校验数据传输或者保存后可能出现的错误,进而确保传输的数据准确无误。
2.原理:
(1)接收方与发送方先协商好一个整数n。若传输过程中信号无误,那么整数n应该是能被发送方发送的信息和接收方接受的信息整除的。因为正常来说,发送方发送的信息和接收方接受的信息应该是保持一致的。
(2)发送方在获取到要发送的数据D之后,为了保证能整除数n,需要在发送的数据后接上校验码CR,注意不是直接加,而是把D和CR都看作二进制数。例如要进行CRC-8校验,那么CR就应该是由8位二进制数组成的,这是可以把D左移八位,然后与CR进行或运算,这样就把D和CR拼接到了一起,构成了发送方要发送的信息Message。
(3)CR的选取不是任意的,它的选取与接受方和发送方协商的整数n有关,还与要发送的数据D有关。CR的构造用到了模二除法,或者说是异或运算。
例:
发送的数据为:D=1 1010 0010(b)
协商的整数为:P=1 0011 0110 (b)(P的位数:校验位+1)
校验码CR的计算方法如下:
在这里插入图片描述这样我们就可以得到要发送的全部信息:Message=(D<<8)|CR

计算校验码CR的参考链接.

二、算法

以CRC-16校验为例
方法一:
1.确定要发送的数据D的位数m;
2.将要发送的数据D左移16位得到D1,作为被除数;
3.依据校验场景选定合适的除数P(17位);
4.D1和P异或的结果送到D1;
5.将D1左移一位后送到D1,移动次数n++;
6.n<m,转7,否则转8;
7.D1首位为0,转5;首位为1转4;
8.校验码CR就是最后出来的D1;
9.要发送的信息Message=(D1<<16)|CR。
方法二:
1.确定要发送的数据D的位数m;
2.将要发送的数据D左移16位得到D1,作为被除数;
3.依据校验场景选定合适的除数P(16位,与法一相比,去掉了法一中的P的首位);
4.移动次数n<m,转5,否则,转8
5.若D1首位为0,将D1左移一位送入D1,转7,否则跳过此步;
6.若D1首位为1,将D1左移一位送入D1,然后D1在和P异或,结果仍送入D1;
7.n++,转4;
8.校验码CR就是最后出来的D1;
9.要发送的信息Message=(D1<<16)|CR;
方法三:(Modbus协议中采用的CRC校验)
1.定义一个16位的无符号变量CR,初值为0XFFFF;
2.把报文的第一个八位字节和CR的低字节异或,结果送入CR;
3.若CR最低位为0,将CR右移一位送入 CR,转5,否则跳过;
4.若CR最低位为1,将CR右移一位送入 CR,然后将CR与0XA001异或的结果送入CR,否则跳过;
5: 移位次数n++,n<8则转3,否则转6;
6.重复步骤2和5,进行通讯信息帧下一个字节的处理;
7. CR中生成的即是最终的CRC校验码;
8.当CRC值放在报文中的时候高低字节必须交换位置;
Modbus协议中采用的CRC校验参考链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

crc校验 的相关文章

  • CRC计算的简单原理及代码实现(python)

    目录 多项式的获取 CRC计算的示例图 示例代码 多项式的获取 举例如下 xff08 其余的多项式依次类推即可 xff09 xff1a 故最终多项式获取的参与异或计算的数据为 xff1a 1011 CRC计算的示例图 假设原始数据为 xff
  • SPI的CRC校验计算

    22 3 6 CRC计算 CRC校验仅用于保证全双工通信的可靠性 数据发送和数据接收分别使用单独的CRC计算器 通过对每一个接收位进行可编程的多项式运算来计算CRC CRC的计算是在由SPI CR1寄存器 中CPHA和CPOL位定义的采样时
  • GD32VF103之CRC

    在GD32VF103内部有一个CRC 循环冗余校验计算单元 xff0c 使用它可以对数据的完整性和正确性进行校验 xff0c 比如固件的完整性和正确性校验 通信数据的校验等 它使用固定的32位多项式 xff1a 0x4C11DB7 xff1
  • C# Modbus CRC校验

    Modbus CRC校验 直接输入byte 输出bool public static bool CRC Check byte byteData bool Flag false byte CRC new byte 2 UInt16 wCrc
  • CRC原理介绍及STM32 CRC外设的使用

    1 CRC简介 循环冗余校验 英语 Cyclic redundancy check 简称CRC 由 W Wesley Peterson 于 1961 年首次提出的一种纠错码理论 CRC是一种数据纠错方法 主要应用于数据通信或者数据存储的场合
  • CRC校验详解(附代码示例)

    目录 1 CRC校验原理 2 生成多项式 3 以CRC 16校验为例讲解编程实现 3 3 1 完全按照CRC原理实现校验 3 3 2 工程中常用CRC校验过程 3 3 3 改进的CRC校验过程 4 以CRC 8校验为例讲解查表法 5 以CR
  • CRC算法并行运算Verilog实现

    因为CRC循环冗余校验码的算法和硬件电路结构比较简单 所以CRC是一种在工程中常用的数据校验方法 尽管CRC简单 但在工程应用中还是有些问题会对工程师产生困惑 这篇文章将介绍一下CRC 希望对大家有所帮助 一 CRC算法介绍 CRC校验原理
  • CRC的基本原理详解

    CRC Cyclic Redundancy Check 被广泛用于数据通信过程中的差错检测 具有很强的 检错能力 本文详细介绍了CRC的基本原理 并且按照解释通行的查表算法的由来的思路介绍 了各种具体的实现方法 1 差错检测 数据通信中 接
  • _mm_crc32_u64 定义不明确

    为什么世界上有 mm crc32 u64 像这样定义 unsigned int64 mm crc32 u64 unsigned int64 crc unsigned int64 v crc32 指令always累积 32 位 CRC nev
  • 大多数静态数据流的 CRC 计算

    背景 我有一段内存 1024字节 最后 1020 字节始终相同 前 4 个字节将发生变化 产品的序列号 我需要计算CRC 16 CCITT 0xFFFF 起始 0x1021 掩码 对于整个内存部分 CRC WHOLE 问题 是否可以仅计算前
  • 如何使用Python计算这个CRC?

    我需要使用 Python 计算此 CRC 以便与 Aurora ABB 太阳能逆变器进行通信 这是文件 http www drhack it images PDF AuroraCommunicationProtocol 4 2 pdf在最后
  • _mm_crc32_u8 给出的结果与参考代码不同

    我一直在与内在因素作斗争 特别是使用标准 CRC 计算和据推测等效的英特尔内在函数 我想转而使用 mm crc32 u16 and mm crc32 u32但如果我不能让 8 位操作工作 那就没有意义了 static UINT32 g ui
  • 如何在python3中计算ANSI CRC16多项式(0x8005)?

    我尝试使用此代码计算 ANSI CRC16 多项式 0x8005 import crcmod crc16 crcmod mkCrcFun 0x8005 0xffff True 但我收到此错误消息 ValueError 多项式的次数必须为 8
  • Python 中的 CRC16

    如何在Python中计算CRC16 在 Perl 中我会写这样的东西 use Digest CRC crc16 result crc16 str 我如何在Python中做同样的事情 这里有一个计算CRC16的库http pypi pytho
  • 算法 CRC-12

    我正在尝试对 12 位 CRC 和算法执行 crc table 但总是得到错误的结果 你能帮助我吗 要创建 crc 表 我尝试 void crcInit void unsigned short remainder int dividend
  • 是否有一种校验和算法也支持从中“减去”数据?

    我有一个包含大约 1 亿个文档的系统 我想跟踪它们在镜像之间的修改 为了有效地交换有关修改的信息 我想按天发送有关修改文档的信息 而不是按每个单独的文档发送 像这样的事情 2012 03 26 cs26 2012 03 25 cs25 20
  • 计算 CRC 初始值而不是将 CRC 附加到有效负载

    我实现的大部分 CRC 都是追加计算出的 CRC 值到消息 有效负载 并在所有字节 包括 之后在接收器处检查零结果 CRC 值通过 CRC 寄存器输入 显然这是一个相当标准的方法 现在我想使用不同的方法 根据有效负载计算一个值 使用该值作为
  • 计算 HDLC 帧的 FCS(CRC)

    我有以下框架 7e 01 00 00 01 00 18 ef 00 00 00 b5 20 c1 05 10 02 71 2e 1a c2 05 10 01 71 00 6e 87 02 00 01 42 71 2e 1a 01 96 27
  • 具有 PCLMULQDQ 的快速 CRC *未反映*

    我正在尝试写一个PCLMULQDQ 优化的 CRC 32 https www intel com content dam www public us en documents white papers fast crc computatio
  • 零填充缓冲区/文件的 CRC32 计算

    如果我想计算大量连续零字节的 CRC32 值 在给定零运行长度的情况下 是否可以使用恒定时间公式 例如 如果我知道我有 1000 个字节全部用零填充 有没有办法避免 1000 次迭代的循环 只是一个例子 对于这个问题 实际的零数量是无限的

随机推荐

  • 0.0C++和C的区别

    C 43 43 和C的区别 C 43 43 如今是一个同时支持面向过程 面向对象 函数形式 泛型形式 元编程形式的语言 我们该如何理解C 43 43 这门语言呢 xff1f Effective C 43 43 书中给出了一个简单的方法 xf
  • 15.9为什么要将成员变量设置为private

    为什么要将成员变量声明为private 为什么要将成员变量封装为private xff0c 主要有以下四个原因 xff1a 好处1 xff1a 如果成员变量不是public xff0c 那么客户唯一能访问成员变量的唯一方式就是通过成员函数
  • 2.7.C++中static关键字的5种基本用法

    static关键字 static关键字主要应用于以下几种情况 xff1a 情况1 xff1a static静态函数 定义静态函数 xff1a 在函数返回类型前加上static关键字 xff0c 函数即被定义为静态函数 静态函数只能在本源文件
  • 进程调度算法

    进程调度 在多道程序系统中 xff0c 进程数量往往多于处理机的个数 xff0c 因此进程竞争使用处理机的情况在所难免 处理机调度是对处理机进行分配 xff0c 即从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行 xff0c 以
  • git clone 出现fatal: unable to access ‘https://github 类错误解决方法

    git clone 遇到问题 xff1a fatal unable to access https github comxxxxxxxxxxx Failed to connect to xxxxxxxxxxxxx 问题 将命令行里的http
  • 进程通信的方式

    进程通信 1 进程通信的概念 进程是一个独立的资源分配单元 xff0c 不同进程 xff08 主要是指不同的用户进程 xff09 之间的资源是独立的 xff0c 没有关联的 xff0c 不能在一个进程中直接访问另一个进程的资源 但是 xff
  • 网络通信的过程

    网络通信的过程 封装 上层协议时如何使用下层协议提供的服务的呢 xff1f 其实这是通过封装实现的 应用程序是在发送到物理网络上之前 xff0c 将沿着协议栈从上往下依次传递 每层协议都将在上层数据的基础上加上自己的头部信息 xff08 有
  • TCP三次握手、四次挥手

    TCP通信流程 TCP和UDP TCP和UDP区别如下 xff1a UDP xff1a 用户数据报文协议 xff0c 面向无连接 xff0c 可以单播 xff0c 多播 xff0c 广播 xff0c 面向数据报 xff0c 不可靠 TCP
  • Qt的多线程编程

    Qt线程 基本概念 并发 当有多个线程在操作时 xff0c 如果系统只有一个CPU xff0c 则它根本不可能真正同时进行一个以上的线程 xff0c 它只能把CPU运行时间划分成若干个时间段 xff0c 再将时间段分配给各个线程执行 xff
  • CMake编译C++文件

    这篇文章介绍如何使用cmake工具编译一个最简单的helloworld cpp文件 首先创建一个空的文件夹 mkdir cmake test 在该文件夹下 xff0c 我们新建一个helloworld cpp文件 span class to
  • 智能小车建图导航-在rviz中导航(运行)

    笔记来源 xff1a 机器人开发与实践 xff08 古月 xff09 或者直接运行这个脚本文件 xff1a xff08 如果你没有在 bracsh文件中加入source xff0c 建议加入或者在脚本文件的上面中添加source xff0c
  • 004-S500无人机-相关的器件参数以及计算

    这篇博客主要是记录S500无人机的相关器件的参数 xff0c 参数的来源来源于holybro官网 xff1a https shop holybro com 我这里进行参数的归纳以及计算 一 电机 xff08 2216 880kv xff09
  • TX2 学习记录(开启板载/USB摄像头)

    刚拿到手一个TX2 xff0c 简单地学习一下这块板子 xff0c 因为是学长留下来的板子 xff0c 所以刷机的步骤我就省略了 xff0c 各位小伙伴可以参考其他大佬的博客进行刷机 xff0c 再来就记录一下一些操作指令吧 打开USB摄像
  • ubuntu16.04中进行ROS通信编程

    ROS通信学习 基础知识学习字段ROS通信小例子一 创建一个工作区二 创建一个ROS工程包三 创建通信的发 收节点四 测试程序的正确性 图像ROS通信小例子视频ROS通信小例子多机ROS通信 基础知识学习 x1f31f 话题与服务的区别 话
  • 2021电赛F题智能送药小车方案分析(openMV数字识别,红线循迹,STM32HAL库freeRTOS,串级PID快速学习,小车自动返回)

    2021全国大学生电子设计竞赛F题智能送药小车 前提 xff1a 本篇文章重在分享自己的心得与感悟 xff0c 我们把最重要的部分 xff0c 摄像头循迹 xff0c 摄像头数字识别问题都解决了 xff0c 有两种方案一种是openARTm
  • CARLA常见错误解决方案以及常见的问题解决方案

    记录Linux环境 Windows环境下常见的运行自动驾驶仿真器CARLA出现的错误 问题1 问题1比较基础 xff0c 创建虚拟环境以及删除虚拟环境 conda create span class token operator span
  • cmd找不到conda以及通过cmd启用Anaconda中的Python环境(base)

    问题 xff1a 在cmd中输入python无法进入或启用python ipython conda jupyter notebook 一 解决方法 xff1a 在系统环境中添加Anaconda路径 lt 1 gt 1 打开高级系统设置 xf
  • c语言实现strcat函数

    char strcat char strDestination const char strSource 一 函数介绍 作用 xff1a 连接字符串的函数 xff0c 函数返回指针 xff0c 两个参数都是指针 xff0c 第一个参数所指向
  • C/C++的static关键字作用(转载)

    一 限制符号的作用域只在本程序文件 若变量或函数 xff08 统称符号 xff09 使用static修饰 xff0c 则只能在本程序文件内使用 xff0c 其他程序文件不能调用 xff08 非static的可以通过extern 关键字声明该
  • crc校验

    参考链接 xff1a https www cnblogs com esestt archive 2007 08 09 848856 html 一 CRC校验原理 1 CRC校验全称为循环冗余校验 xff08 Cyclic Redundanc