登录/注册

crc校验算法

更多

CRC(循环冗余校验,Cyclic Redundancy Check)是一种常用的数据错误检测算法,通过生成校验码来验证数据传输或存储的完整性。以下是核心原理和步骤:

核心原理

  1. 多项式除法

    • 将数据视为二进制多项式(如 1011 = (x^3 + x + 1))。
    • 用预定义的生成多项式(如 CRC-16 的 0x8005)对数据进行模2除法(异或操作)。
    • 除法后的余数即为 CRC 校验码。
  2. 校验码附加

    • 计算出的 CRC 校验码附加到原始数据末尾,一起传输或存储。
  3. 接收方验证

    • 接收方用相同生成多项式对完整数据(含 CRC 码)再做一次模2除法。
    • 若余数为 0,则数据正确;否则存在错误。

关键步骤(示例)

假设数据:11010011101100,生成多项式:1011(CRC-4)。

  1. 数据补位
    在数据末尾补 生成多项式位数-10(此处补 3 个 0):
    1101001110110011010011101100**000**

  2. 模2除法(异或操作)

    11010011101100000  ÷ 1011
    - 逐位对齐,按位异或(相同为0,不同为1)。
    - 过程示例:
       11010011101100000
     ^ 1011          → 第一次对齐
       ---------
       01100011101100000
     ^  1011         → 第二次对齐
       ---------
        00111011101100000
     ^     1011      → 继续...

    最终得到余数 010(若不足位数,前面补 0)。

  3. 附加校验码
    原始数据 + 余数:11010011101100 + 010

  4. 接收方验证
    110100111011000101011 再次除法:

    • 若余数为 0,数据正确;否则错误。

常用生成多项式(标准)

CRC 类型 生成多项式(十六进制) 应用场景
CRC-8 0x07 简单通信协议
CRC-16 0x8005 Modbus, USB
CRC-32 0x04C11DB7 ZIP, Ethernet, PNG

特点

  1. 检错能力
    • 可检测单比特错、双比特错、奇数个错、突发错误(长度 ≤ 校验码位数)。
  2. 效率
    • 计算速度快(硬件或查表优化)。
  3. 非加密
    • 仅用于错误检测,无加密功能。

代码实现(Python 示例)

def crc16(data: bytes) -> int:
    crc = 0xFFFF  # CRC-16 初始值
    poly = 0x8005  # 生成多项式

    for byte in data:
        crc ^= byte << 8
        for _ in range(8):
            if crc & 0x8000:
                crc = (crc << 1) ^ poly
            else:
                crc <<= 1
            crc &= 0xFFFF  # 保持16位

    return crc

# 使用示例
data = b"Hello"
checksum = crc16(data)
print(f"CRC-16 校验码: {checksum:04X}")  # 输出十六进制

常见问题

CRC 因其高效性和可靠性,广泛应用于网络通信、存储系统(ZIP/PNG)、工业控制等领域。

浅析MCU通信、存储常用的简单校验算法

UART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有

2024-03-07 10:56:20

fpga报告crc故障是什么意思

方法,通过对发送的数据进行计算并附加到数据末尾,接收方能够使用相同的校验算法来检测传输中的错误。CRC可以检测多种不同类型的错

2024-01-04 11:06:15

虹科技术|保障数据传输稳定性:BabyLIN产品的CRC算法实现

文章将以CRC8校验为例,介绍在BabyLIN产品中如何使用CRC校验算法

2024-01-02 10:45:16

CRC校验原理及实现

作者:王超首发:电子电路开发学习目录前言CRC算法简介CRC计算CRC

资料下载 马占云 2022-01-26 17:37:32

CRC校验算法原理及c语言实现

CRC校验算法原理及c语言实现

资料下载 r_e_n_y_u 2021-11-30 10:04:07

CRC校验码并行计算的FPGA实现

用软件实现 CRC 校验码计算很难满足高速数据通信的要求 ,基于硬件的实现方法中 ,有串行经典算法 LFSR 电路 以及由软件

资料下载 姚小熊27 2021-03-28 09:34:24

如何使用51单片机实现CRC校验算法

介绍了CRC(循环冗余码校验)原理及集成混合信号片上系统单片机C8051F的新特性,推导获得以字节为单位的数据序列CRC码递推

资料下载 佚名 2019-12-17 16:09:41

如何使用SMART编写CRC校验算法程序

本文档的主要内容详细介绍的是如何使用SMART编写CRC的校验算法程序。

资料下载 潘广 2019-10-24 08:00:00

常用的校验算法有哪些?

常用的校验算法有哪些,是不是和通信规约有关。比如MODBUS一般都用CRC16(不确定是不是叫这个)。这些校验算法是之前积累下来的吗。自己也可以

2023-11-03 06:50:59

TSMaster中如何自定义CRC校验算法

在通讯过程中,用户需要利用CheckSum信号对传输数据用自己规定的算法逻辑进行校验,来看数据在传输过程中是否被更改或传输错误。本文主要介绍TSMaster如何设置自己的

2023-09-09 08:23:25

单片机中几种常见的校验算法介绍

CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(

2023-06-05 14:25:53

单片机中常用的轻量级校验算法

UART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有

2023-03-24 10:22:42

CRC校验快速算法的原理及实现改进设计

文献[1]提出了一种针对整字节的CRC快速算法。它的基本思想是预先生成一个余式表,通过查表,利用递推原理进行快速计算。现以 CCITT(国际电话电报咨询委员会)建议的,用于基本型数据传输规程的生成多项式为例,简要介绍

2020-09-14 17:42:48

基于TMS320C64x的CRC校验算法分析

CRC(Cyclic Redundancy Check)循环冗余校验码是数据通信领域中常用的一种差错校验码,在早期的通信中运用广泛。

2020-08-10 16:46:51

CRC校验 、STM32中CRC计算单元、 CRC应用

CRC校验、STM32中CRC计算单元、CRC应用

2020-03-04 13:54:44

7天热门专题 换一换
相关标签