探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验

news2025/3/5 1:32:49

文章目录

      • 2.5 CRC 校验
        • 2.5.1 前言
        • 2.5.2 CRC算法简介
        • 2.5.3 CRC计算的详细过程
        • 2.5.4 CRC校验的两种方法详解
          • **分离比较法**
          • **整体运算法**
          • **不同位出错与余数的关系**
          • **总结**
        • 2.5.5 CRC计算的C++实现及工具介绍
          • **C++实现CRC计算**
          • **CRC计算工具推荐**
        • **2.5.6 总结:CRC校验的局限性与纠错原理**

本博客为系列博客,主要讲解各基带算法的原理与应用,包括:viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/DFT、QAMtiaozhi/解调、QPSK调制/解调。其他博客链接如下:

  1. 探秘基带算法:从原理到5G时代的通信变革【一】引言
  2. 探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码
  3. 探秘基带算法:从原理到5G时代的通信变革【三】Turbo 编解码
  4. 探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(一)
  5. 探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(二)
  6. 探秘基带算法:从原理到5G时代的通信变革【五】CORDIC算法
  7. 探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验
  8. 探秘基带算法:从原理到5G时代的通信变革【七】FFT/DFT
  9. 探秘基带算法:从原理到5G时代的通信变革【八】QAM 调制 / 解调
  10. 探秘基带算法:从原理到5G时代的通信变革【九】QPSK调制/解调
  11. 探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比

2.5 CRC 校验

[CRC校验]手算与直观演示_哔哩哔哩_bilibili,讲解的非常清楚。一定要先看这个!!!

2.5.1 前言

在现代通信系统中,数据传输的完整性是确保信息正确传递的关键。一个完整的数据帧通常由多个部分构成,包括帧头、数据位和帧尾等。其中,校验位的作用尤为重要,它通过对原始数据进行特定算法计算生成一个校验值,并将其附加到数据帧中。接收方接收到数据后,使用相同的算法对原始数据重新计算校验值并与接收到的校验值进行比较。如果两者一致,则说明数据在传输过程中未发生错误;否则,表明数据可能被篡改或损坏,需要丢弃并请求重发。

img

常见的校验算法包括奇偶校验、校验和、循环冗余校验(Cyclic Redundancy Check,CRC),以及较少使用的纵向冗余校验(Longitudinal Redundancy Check,LRC)和块校验码(Block Check Character,BCC)。然而,不同的校验方法具有各自的优缺点。例如,奇偶校验是一种简单但误码率较高的校验方式。以串口通信中的奇校验为例,假设原始数据为0001 0011,其中1的个数为3,因此奇校验位为0。如果传输过程中数据受到干扰,接收端接收到的数据变为0010 0011,尽管1的个数仍为奇数,校验通过,但实际上数据已经发生了错误。类似的问题也可能出现在校验和算法中。

img

为了提高数据传输的健壮性和稳定性,通信系统通常结合高效的校验算法和数字信号编码方式。例如,以太网协议采用了CRC-32校验曼彻斯特编码。这种组合能够显著降低误码率,确保数据的可靠传输。本文将重点介绍CRC校验的原理及其具体实现方法。

在这里插入图片描述

2.5.2 CRC算法简介

循环冗余校验(Cyclic Redundancy Check,CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

CRC校验计算速度快,检错能力强,易于用编码器等硬件电路实现。从检错的正确率与速度、成本等方面,都比奇偶校验等校验方式具有优势。因而,CRC 成为计算机信息通信领域最为普遍的校验方式。常见应用有以太网/USB通信,压缩解压,视频编码,图像存储,磁盘读写等。


  • CRC参数模型

不知道你是否遇到过这种情况,同样的CRC多项式,调用不同的CRC计算函数,得到的结果却不一样,而且和手算的结果也不一样,这就涉及到CRC的参数模型了。计算一个正确的CRC值,需要知道CRC的参数模型。

一个完整的CRC参数模型应该包含以下信息:

  • NAME:参数模型名称。
  • WIDTH:宽度,即生成的CRC数据位宽,如CRC-8,生成的CRC为8位。
  • POLY:十六进制多项式,省略最高位1,如 x 8 + x 2 + x + 1 x^8 + x^2 + x + 1 x8+x2+x+1,二进制为1 0000 0111,省略最高位1,转换为十六进制为0x07
  • INIT:CRC初始值,和WIDTH位宽一致。
  • REFIN:true或false,在进行计算之前,原始数据是否翻转,如原始数据:0x34 = 0011 0100,如果REFIN为true,进行翻转之后为0010 1100 = 0x2c
  • REFOUT:true或false,运算完成之后,得到的CRC值是否进行翻转,如计算得到的CRC值:0x97 = 1001 0111,如果REFOUT为true,进行翻转之后为11101001 = 0xE9
  • XOROUT:计算结果与此参数进行异或运算后得到最终的CRC值,和WIDTH位宽一致。

通常如果只给了一个多项式,其他的没有说明则:INIT=0x00,REFIN=false,REFOUT=false,XOROUT=0x00。


  • 常用的21个标准CRC参数模型

以下是常用的21个标准CRC参数模型:

CRC算法名称多项式公式WIDTHPOLYINITXOROUTREFINREFOUT
CRC-4/ITU x 4 + x + 1 x^4 + x + 1 x4+x+14030000TRUETRUE
CRC-5/EPC x 5 + x 3 + 1 x^5 + x^3 + 1 x5+x3+15090900FALSEFALSE
CRC-5/ITU x 5 + x 4 + x 2 + 1 x^5 + x^4 + x^2 + 1 x5+x4+x2+15150000TRUETRUE
CRC-5/USB x 5 + x 2 + 1 x^5 + x^2 + 1 x5+x2+15051F1FTRUETRUE
CRC-6/ITU x 6 + x + 1 x^6 + x + 1 x6+x+16030000TRUETRUE
CRC-7/MMC x 7 + x 3 + 1 x^7 + x^3 + 1 x7+x3+17090000FALSEFALSE
CRC-8 x 8 + x 2 + x + 1 x^8 + x^2 + x + 1 x8+x2+x+18070000FALSEFALSE
CRC-8/ITU x 8 + x 2 + x + 1 x^8 + x^2 + x + 1 x8+x2+x+18070055FALSEFALSE
CRC-8/ROHC x 8 + x 2 + x + 1 x^8 + x^2 + x + 1 x8+x2+x+1807FF00TRUETRUE
CRC-8/MAXIM x 8 + x 5 + x 4 + 1 x^8 + x^5 + x^4 + 1 x8+x5+x4+18310000TRUETRUE
CRC-16/IBM x 16 + x 15 + x 2 + 1 x^{16} + x^{15} + x^2 + 1 x16+x15+x2+116800500000000TRUETRUE
CRC-16/MAXIM x 16 + x 15 + x 2 + 1 x^{16} + x^{15} + x^2 + 1 x16+x15+x2+11680050000FFFFTRUETRUE
CRC-16/USB x 16 + x 15 + x 2 + 1 x^{16} + x^{15} + x^2 + 1 x16+x15+x2+1168005FFFFFFFFTRUETRUE
CRC-16/MODBUS x 16 + x 15 + x 2 + 1 x^{16} + x^{15} + x^2 + 1 x16+x15+x2+1168005FFFF0000FALSEFALSE
CRC-16/CCITT x 16 + x 12 + x 5 + 1 x^{16} + x^{12} + x^5 + 1 x16+x12+x5+116102100000000TRUETRUE
CRC-16/CCITT-FALSE x 16 + x 12 + x 5 + 1 x^{16} + x^{12} + x^5 + 1 x16+x12+x5+1161021FFFF0000FALSEFALSE
CRC-16/X25 x 16 + x 12 + x 5 + 1 x^{16} + x^{12} + x^5 + 1 x16+x12+x5+1161021FFFFFFFFTRUETRUE
CRC-16/XMODEM x 16 + x 12 + x 5 + 1 x^{16} + x^{12} + x^5 + 1 x16+x12+x5+116102100000000FALSEFALSE
CRC-16/DNP x 16 + x 13 + x 12 + x 11 + x 10 + x 8 + x 6 + x 5 + x 2 + 1 x^{16} + x^{13} + x^{12} + x^{11} + x^{10} + x^8 + x^6 + x^5 + x^2 + 1 x16+x13+x12+x11+x10+x8+x6+x5+x2+1163D650000FFFFTRUETRUE
CRC-32 x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1 x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+13204C11DB7FFFFFFFFFFFFFFFFTRUETRUE
CRC-32/MPEG-2 x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1 x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+13204C11DB7FFFFFFFF0FALSEFALSE

这些参数模型定义了不同应用场景下的CRC校验方法,确保了在特定协议或标准下数据传输的可靠性和一致性。


  • CRC校验在电子通信中的广泛应用

循环冗余校验(Cyclic Redundancy Check,CRC)是一种广泛应用于电子通信领域的数据完整性检测技术。其高效性和可靠性使其成为现代通信系统中不可或缺的一部分。无论是芯片级的单总线通信,还是大规模的数据传输协议,CRC校验都扮演着重要角色。


美信(MAXIM)芯片中的CRC-8/MAXIM模型

美信公司(MAXIM)生产的DS2401和DS18B20等芯片广泛使用了CRC-8/MAXIM参数模型。这种模型特别适用于单总线通信协议,能够有效检测数据传输过程中的错误。CRC-8/MAXIM的核心参数包括:

  • 多项式 x 8 + x 5 + x 4 + 1 x^8 + x^5 + x^4 + 1 x8+x5+x4+1,十六进制表示为0x31
  • 初始值0x00
  • 输入翻转(REFIN):TRUE,表示在计算前需要对输入数据进行比特级翻转。
  • 输出翻转(REFOUT):TRUE,表示计算结果需要再次翻转。
  • 异或值(XOROUT)0x00

通过这些参数的组合,CRC-8/MAXIM能够在有限的计算资源下提供高效的错误检测能力。


SD卡或MMC中的CRC-7/MMC模型

SD卡和MMC存储设备中使用的CRC-7/MMC模型是一种低开销、高性能的校验方法。它主要用于检测命令和数据传输过程中的错误。CRC-7/MMC的核心参数如下:

  • 多项式 x 7 + x 3 + 1 x^7 + x^3 + 1 x7+x3+1,十六进制表示为0x09
  • 初始值0x00
  • 输入翻转(REFIN):FALSE。
  • 输出翻转(REFOUT):FALSE。
  • 异或值(XOROUT)0x00

由于SD卡和MMC设备通常涉及大量数据块的传输,CRC-7/MMC模型以其简洁性和高效性成为理想选择。


Modbus通信中的CRC-16/MODBUS模型

Modbus是一种常见的工业通信协议,广泛应用于自动化控制领域。在Modbus通信中,CRC-16/MODBUS模型用于确保数据帧的完整性。其核心参数包括:

  • 多项式 x 16 + x 15 + x 2 + 1 x^{16} + x^{15} + x^2 + 1 x16+x15+x2+1,十六进制表示为0x8005
  • 初始值0xFFFF
  • 输入翻转(REFIN):FALSE。
  • 输出翻转(REFOUT):FALSE。
  • 异或值(XOROUT)0x0000

CRC-16/MODBUS模型通过较高的位宽提供了更强的错误检测能力,适合工业环境中复杂数据帧的校验需求。


USB协议中的CRC-5/USB和CRC-16/USB模型

USB(Universal Serial Bus)协议中使用了两种不同的CRC模型来满足不同场景的需求:

  • CRC-5/USB:用于短数据包的快速校验,常见于握手信号和令牌包。

    • 多项式: x 5 + x 2 + 1 x^5 + x^2 + 1 x5+x2+1,十六进制表示为0x05
    • 初始值:0x1F
    • 输入翻转(REFIN):TRUE。
    • 输出翻转(REFOUT):TRUE。
    • 异或值(XOROUT):0x1F
  • CRC-16/USB:用于数据包的完整校验,适合大规模数据传输。

    • 多项式: x 16 + x 15 + x 2 + 1 x^{16} + x^{15} + x^2 + 1 x16+x15+x2+1,十六进制表示为0x8005
    • 初始值:0xFFFF
    • 输入翻转(REFIN):TRUE。
    • 输出翻转(REFOUT):TRUE。
    • 异或值(XOROUT):0xFFFF

这两种模型的结合使得USB协议能够在保证速度的同时兼顾可靠性。

img

图:USB协议中CRC校验的应用。


STM32硬件CRC计算模块中的CRC-32模型

STM32微控制器内置了硬件CRC计算模块,支持CRC-32标准模型。该模型广泛应用于文件传输和网络通信中,具有极高的错误检测能力。其核心参数如下:

  • 多项式 x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1 x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1,十六进制表示为0x04C11DB7
  • 初始值0xFFFFFFFF
  • 输入翻转(REFIN):TRUE。
  • 输出翻转(REFOUT):TRUE。
  • 异或值(XOROUT)0xFFFFFFFF

通过硬件加速,STM32能够在不占用过多CPU资源的情况下完成复杂的CRC计算,显著提高了系统的性能。

单片机CRC校验-CSDN博客

图:STM32硬件CRC模块的工作原理。


2.5.3 CRC计算的详细过程

在电子通信领域,CRC校验是一种广泛使用的数据完整性检测技术。为了更好地理解CRC校验的工作原理,我们可以通过一个具体的例子来手算CRC值,并逐步解析其计算过程。


  • 问题描述

假设原始数据为0x34,使用CRC-8/MAXIM参数模型计算CRC值。根据CRC-8/MAXIM的参数模型,我们可以提取以下信息:

  • POLY = 0x31 = 0011 0001(最高位1已省略)
  • INIT = 0x00
  • XOROUT = 0x00
  • REFIN = TRUE(输入数据需要翻转)
  • REFOUT = TRUE(输出结果需要翻转)

有了这些参数,我们就可以开始详细的计算过程。


  • 计算步骤

(1)第一步:初始化

原始数据为0x34,对应的二进制表示为0011 0100。初始值INIT0x00,因此原始数据与初始值进行异或运算后保持不变:

原始数据 ⊕ INIT = 0011   0100 ⊕ 0000   0000 = 0011   0100 \text{原始数据} \oplus \text{INIT} = 0011\ 0100 \oplus 0000\ 0000 = 0011\ 0100 原始数据INIT=0011 01000000 0000=0011 0100


(2)第二步:输入数据翻转

由于REFIN = TRUE,我们需要对原始数据进行比特级翻转。翻转后的结果为:

0011   0100 → 0010   1100 0011\ 0100 \rightarrow 0010\ 1100 0011 01000010 1100


(3)第三步:左移并补零

将翻转后的数据左移8位,并在末尾补上8个0,得到扩展后的数据:

0010   1100   0000   0000 0010\ 1100\ 0000\ 0000 0010 1100 0000 0000


(4)第四步:模2除法求余数

接下来,使用生成多项式POLY = 0x31 = 1 0011 0001对扩展后的数据进行模2除法运算。模2除法的核心是通过逐位比较和异或操作,逐步消去最高位的1,直到余数的长度小于多项式的阶数为止。

以下是具体的计算过程:

  1. 取扩展数据的前9位(因为生成多项式的阶数为8):1011 0000 0000

  2. 将生成多项式1 0011 0001与这9位进行异或运算:
    1011   0000   0 ⊕ 1   0011   0001 = 0010   1000   1 1011\ 0000\ 0 \oplus 1\ 0011\ 0001 = 0010\ 1000\ 1 1011 0000 01 0011 0001=0010 1000 1

  3. 将结果右移,继续取下一位数据进行异或运算,重复上述步骤,直到处理完整个扩展数据。
    img

  4. 最终得到的余数为1111 1011

  5. 如果这个计算过程不理解,请查看:[CRC校验]手算与直观演示_哔哩哔哩_bilibili,讲解的非常清楚。一定要看!!!


(5)第五步:输出结果翻转

由于REFOUT = TRUE,需要对最终结果进行比特级翻转。翻转后的结果为:

1111   1011 → 1101   1111 1111\ 1011 \rightarrow 1101\ 1111 1111 10111101 1111


(6)第六步:与XOROUT进行异或

将模2除法得到的余数1111 1011XOROUT0x00进行异或运算:

1101   1111 ⊕ 0000   0000 = 1101   1111 = 0 x D F 1101\ 1111 \oplus 0000\ 0000 = 1101\ 1111 = 0xDF 1101 11110000 0000=1101 1111=0xDF


(7)最终结果

经过以上步骤,我们得到了CRC-8/MAXIM校验值为0xDF。将该值附加到原始数据之后,完整的数据帧为:

0011   0100   1101   1111 = 34 D F 0011\ 0100\ 1101\ 1111 = 34DF 0011 0100 1101 1111=34DF


  • 验证计算结果

为了确保计算正确性,可以使用CRC计算工具或软件进行验证。如果计算结果与工具输出一致,则说明我们的计算过程无误。需要注意的是,不同工具可能使用不同的参数模型,因此在验证时必须确保所有参数(如INITXOROUTREFINREFOUT等)完全一致。

img


  • 总结

通过上述手算过程,我们详细解析了CRC-8/MAXIM校验值的计算方法。这一过程包括以下几个关键步骤:

  1. 初始化数据并与初始值进行异或运算。
  2. 根据REFIN参数决定是否对输入数据进行翻转。
  3. 对扩展后的数据进行模2除法运算,求得余数。
  4. 根据REFOUT参数决定是否对余数进行翻转,得到初步结果。
  5. 根据XOROUT参数对初步结果进行异或运算,得到最终结果。

CRC校验的精确性和可靠性依赖于正确的参数设置。因此,在实际应用中,务必仔细核对所有参数,以确保计算结果的一致性。

2.5.4 CRC校验的两种方法详解

在电子通信中,CRC(循环冗余校验)不仅用于数据传输前的错误检测码生成,还用于接收端的数据校验。接收端可以通过两种方式来验证接收到的数据帧是否正确:分离比较法整体运算法。以下将详细介绍这两种方法的工作原理及其背后的数学逻辑。


分离比较法

方法概述

分离比较法的核心思想是对接收到的数据帧进行分离处理,将原始数据与附加的CRC校验码分开。然后,仅对原始数据重新计算CRC值,并将其与接收到的CRC校验码进行比较。如果两者一致,则说明数据传输无误;否则,数据可能在传输过程中发生了错误。

具体步骤

  1. 数据分离
    假设接收到的数据帧为0011 0100 1101 1111,前8位0011 0100是原始数据,后8位1101 1111是CRC校验码。

  2. 重新计算CRC值
    使用与发送端相同的CRC参数模型(如多项式、初始值、输入输出翻转等),对分离出的原始数据0011 0100重新计算CRC值。

  3. 比较结果
    将重新计算得到的CRC值与接收到的CRC校验码1101 1111进行比较。如果两者相等,则认为数据传输正确;否则,数据可能存在错误。


整体运算法

方法概述

整体运算法的核心思想是直接对整个接收到的数据帧进行CRC计算。由于数据帧是由原始数据左移 n n n位并附加CRC值构成的,因此如果数据帧没有发生错误,直接对其进行CRC计算的结果应该为0。

通俗解释与举例说明

为了更好地理解“数据帧是由原始数据左移 n n n位并附加CRC值构成的,因此如果数据帧没有发生错误,直接对其进行CRC计算的结果应该为0”这句话,我们可以从一个简单的例子出发,并结合CRC校验的基本原理进行说明。


背景知识回顾

  1. CRC计算的核心思想
    CRC校验本质上是一种基于模2除法的算法。发送端通过将原始数据左移 n n n位(其中 n n n是CRC值的位数),然后用生成多项式 P P P对扩展后的数据进行模2除法运算,得到余数作为CRC值。最终,将CRC值附加到原始数据后面形成完整的数据帧。

  2. 数据帧的结构
    数据帧的形式可以表示为:
    T = D ⋅ x n + R T = D \cdot x^n + R T=Dxn+R
    其中:

    • D D D:原始数据。
    • n n n:CRC值的位数。
    • R R R:通过模2除法计算得到的CRC值。
  3. 接收端的验证逻辑
    接收端接收到完整数据帧后,直接对整个数据帧进行CRC计算。如果数据帧在传输过程中未发生错误,则整个数据帧能够被生成多项式 P P P整除,余数为0。


通俗解释

假设我们有一个原始数据 D D D和一个生成多项式 P P P。发送端通过以下步骤构造数据帧:

  1. 将原始数据 D D D左移 n n n位,相当于给 D D D后面补了 n n n个0。
  2. 对左移后的数据用生成多项式 P P P进行模2除法运算,得到余数 R R R
  3. 将余数 R R R附加到原始数据 D D D后面,形成完整的数据帧 T T T

由于 T T T的设计方式( T = D ⋅ x n + R T = D \cdot x^n + R T=Dxn+R),它已经满足了模2除法的关系:
T m o d    P = 0 T \mod P = 0 TmodP=0
也就是说,如果数据帧在传输过程中没有发生任何错误,那么接收端对接收到的数据帧 T T T再次进行模2除法运算时,余数必然为0。


举例说明

步骤 1:定义参数

  • 原始数据: D = 0 x 34 = 0011   0100 D = 0x34 = 0011\ 0100 D=0x34=0011 0100
  • 生成多项式: P = 0 x 31 = 0011   0001 P = 0x31 = 0011\ 0001 P=0x31=0011 0001(CRC-8/MAXIM)。
  • CRC值的位数: n = 8 n = 8 n=8

步骤 2:发送端计算CRC值

  1. 将原始数据 D D D左移8位,相当于在其后面补8个0:
    D ⋅ x 8 = 0011   0100   0000   0000 D \cdot x^8 = 0011\ 0100\ 0000\ 0000 Dx8=0011 0100 0000 0000

  2. 对左移后的数据用生成多项式 P P P进行模2除法运算,得到余数 R = 0 x D F = 1101   1111 R = 0xDF = 1101\ 1111 R=0xDF=1101 1111

  3. 将余数 R R R附加到原始数据 D D D后面,形成完整的数据帧:
    T = D ⋅ x 8 + R = 0011   0100   1101   1111 = 34 D F T = D \cdot x^8 + R = 0011\ 0100\ 1101\ 1111 = 34DF T=Dx8+R=0011 0100 1101 1111=34DF

步骤 3:接收端验证

接收端接收到的数据帧为 T = 34 D F = 0011   0100   1101   1111 T = 34DF = 0011\ 0100\ 1101\ 1111 T=34DF=0011 0100 1101 1111。接下来直接对整个数据帧 T T T进行模2除法运算:

  1. 使用生成多项式 P = 0 x 31 = 0011   0001 P = 0x31 = 0011\ 0001 P=0x31=0011 0001对数据帧 T T T进行模2除法运算。
  2. 计算结果表明,余数为0。

这说明数据帧 T T T能够被生成多项式 P P P整除,因此可以确认数据帧在传输过程中没有发生错误。


总结

通过上述例子可以看出,数据帧的设计方式决定了它能够被生成多项式整除(即模2除法余数为0)。如果数据帧在传输过程中发生了错误,例如某一位被翻转,则数据帧不再满足这种关系,模2除法的结果将不再是0,从而可以检测出错误的发生。

具体步骤

  1. 直接计算
    对接收到的完整数据帧0011 0100 1101 1111直接使用相同的CRC参数模型进行计算。
  2. 检查余数
    如果计算得到的余数为0,则说明数据帧无误;否则,数据帧可能在传输过程中发生了错误。

img


不同位出错与余数的关系

现象描述

在实际应用中,如果数据帧中的某一位或多位发生错误,那么通过CRC计算得到的余数通常会与错误的位置相关联。具体来说,不同位的错误会导致不同的余数,而这种对应关系仅取决于所使用的CRC参数模型(如生成多项式、初始值等),而与原始数据无关。

数学证明

假设数据帧中的第 k k k位发生了错误,则可以将错误表示为一个二进制序列 E E E,其中只有第 k k k位为1,其余位均为0。错误后的数据帧可以表示为:
T ′ = T + E T' = T + E T=T+E
T ′ T' T进行模2除法运算时,余数为:
R ′ = ( T + E ) m o d    P R' = (T + E) \mod P R=(T+E)modP
由于 T m o d    P = 0 T \mod P = 0 TmodP=0,因此:
R ′ = E m o d    P R' = E \mod P R=EmodP
由此可见,余数 R ′ R' R仅与错误位置 k k k相关,而与原始数据 T T T无关。


总结

CRC校验的两种方法各有优劣:

  • 分离比较法:需要对接收到的数据帧进行分离处理,适合于需要明确显示接收到的CRC值的场景。
  • 整体运算法:直接对整个数据帧进行计算,无需分离处理,适合于快速判断数据帧是否正确的场景。

无论采用哪种方法,CRC校验的核心都在于利用生成多项式的数学特性,确保数据传输的可靠性。此外,CRC算法的检错能力与其参数模型密切相关,选择合适的参数模型对于提高系统性能至关重要。

2.5.5 CRC计算的C++实现及工具介绍

CRC(循环冗余校验)是一种广泛应用于数据通信和存储领域的错误检测技术。在实际开发中,为了验证自定义实现的正确性,通常需要借助一些标准工具进行对比测试。以下将详细介绍如何用C++实现CRC计算,并推荐几款常用的CRC计算工具。


C++实现CRC计算

  • 核心思想

CRC计算的核心是基于模2除法的多项式运算。通过生成多项式对输入数据进行处理,最终得到一个固定长度的校验码。以下是C++实现CRC计算的基本步骤:

  • 初始化CRC寄存器。
  • 对输入数据逐位或逐字节进行处理。
  • 根据REFIN参数决定是否翻转输入数据。
  • 使用生成多项式进行模2除法运算。
  • 根据REFOUT参数决定是否翻转输出结果。
  • 最后与XOROUT值进行异或操作,得到最终的CRC值。

  • 代码示例:CRC-8/MAXIM

以下是一个简单的C++实现CRC-8/MAXIM的代码示例:

#include <iostream>
#include <vector>
#include <bitset>

using namespace std;

// 按位翻转函数
uint8_t reverse_bits(uint8_t data) {
    uint8_t result = 0;
    for (int i = 0; i < 8; ++i) {
        result = (result << 1) | (data & 1);
        data >>= 1;
    }
    return result;
}

// CRC-8/MAXIM计算函数
uint8_t crc8_maxim(const vector<uint8_t>& data) {
    uint8_t crc = 0x00; // INIT = 0x00
    uint8_t poly = 0x31; // POLY = 0x31

    for (auto byte : data) {
        uint8_t byte_ref = reverse_bits(byte); // REFIN = TRUE
        crc ^= byte_ref;

        for (int i = 0; i < 8; ++i) {
            if (crc & 0x80) {
                crc = (crc << 1) ^ poly;
            } else {
                crc = (crc << 1);
            }
            crc &= 0xFF; // 保持8位
        }
    }

    crc = reverse_bits(crc); // REFOUT = TRUE
    return crc ^ 0x00; // XOROUT = 0x00
}

int main() {
    vector<uint8_t> data = {0x34}; // 输入数据
    uint8_t crc = crc8_maxim(data);
    cout << "CRC-8/MAXIM: " << hex << (int)crc << endl;
    return 0;
}

运行结果:

CRC-8/MAXIM: df

CRC计算工具推荐

  • 在线计算工具

  • 网址:CRC(循环冗余校验)在线计算_ip33.com

  • 功能

    • 支持多种标准CRC模型(如CRC-8/MAXIM、CRC-16/CCITT等)。
    • 允许用户自定义多项式、初始值、输入输出翻转等参数。
    • 提供快速验证的功能,适用于开发者调试和学习。

  • 离线计算工具

  • CRC_Calc v0.1.exe

    • 功能强大,支持自定义CRC算法模型。
    • 提供详细的参数配置选项,便于验证自定义实现的正确性。
  • GCRC.exe

    • 简单易用,支持多种标准CRC模型。
    • 输出结果清晰,适合快速验证。

  • 格西CRC计算器

  • 特点

    • 国产软件,界面友好。
    • 支持多种标准CRC模型和自定义参数。
    • 提供批量计算功能,适合处理大量数据。

img


2.5.6 总结:CRC校验的局限性与纠错原理

  • CRC校验的局限性

尽管CRC校验是一种高效的错误检测方法,但它并不能100%保证数据的完整性。在极少数情况下,可能会出现数据中有错误但CRC校验结果仍为正确的现象。这种概率与以下因素有关:

  • CRC的位数:位数越高,检错能力越强。
  • 生成多项式的选择:不同的多项式具有不同的检错能力,标准多项式经过理论优化,能够提供更高的可靠性。

  • 纠错原理

CRC校验本身主要用于错误检测,而非纠错。然而,在某些特定场景下,可以通过以下方式实现单一比特错误的纠正:

  • 定位错误位置:利用接收到的数据帧重新计算CRC值,并比较计算结果与接收到的CRC值,确定错误发生的比特位置。
  • 修正错误:根据错误位置翻转相应的比特,恢复原始数据。

这种纠错方法的前提是错误必须是单一比特错误,并且生成多项式的设计需要满足一定的数学条件(如汉明距离)。因此,在实际应用中,CRC校验更多地用于检测错误,而纠错功能通常由其他专门的编码技术(如Hamming码、Reed-Solomon码)来实现。


通过以上分析可以看出,CRC校验作为一种高效的数据完整性检测技术,在现代通信和存储系统中发挥了重要作用。在实际开发中,结合标准工具进行验证可以显著提高实现的可靠性,同时理解其局限性和纠错原理有助于更好地应用该技术。

参考资料:CRC校验原理及实现 - 知乎

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

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

相关文章

水仙花数(华为OD)

题目描述 所谓水仙花数&#xff0c;是指一个n位的正整数&#xff0c;其各位数字的n次方和等于该数本身。 例如153是水仙花数&#xff0c;153是一个3位数&#xff0c;并且153 13 53 33。 输入描述 第一行输入一个整数n&#xff0c;表示一个n位的正整数。n在3到7之间&#x…

《白帽子讲 Web 安全》之深入同源策略(万字详解)

目录 引言 一、同源策略基础认知 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;作用 &#xff08;三&#xff09;作用机制详解 二、同源策略的分类 &#xff08;一&#xff09;域名同源策略 &#xff08;二&#xff09;协议同源策略 &#xff08;三&…

USRP4120-通用软件无线电平台

1、产品描述 USRP4120平台是彬鸿科技公司推出的以XILINX XC7Z020 SOC处理器为核心&#xff0c;搭配ADI AD9361射频集成芯片&#xff0c;针对无线通信系统科研与教学实验场景的一款通用软件无线电平台。产品频率范围70MHz~6GHz&#xff0c;模拟带宽200KHz~56MHz&#xff0c;支持…

计算机毕业设计SpringBoot+Vue.js社区智慧养老监护管理平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

yoloV5的学习-pycharm版本

真的很让人气愤的一点&#xff0c;老师把我的pycharm给卸载了&#xff0c;我那个上面不仅有gpu-torch&#xff0c;还有gpu-torch&#xff0c;他给俺删了&#xff0c;删了很久&#xff0c;我心都碎了&#xff0c;过几天我就去找他负责&#xff0c;让他给我装回来我的环境&#x…

蓝桥杯 之 图形规律

文章目录 分析组成&#xff0c;找到规律数正方形 在蓝桥杯中&#xff0c;常常会有一些图形的规律的题目需要我们去解决&#xff0c;所以我们需要学会其中的一些方法&#xff0c;我们这样才能解决对应的问题 方法1&#xff1a;直接对n进行拆分方法2&#xff1a;使用递归的思路&a…

【计算机网络入门】初学计算机网络(八)

目录 1. S-W协议的信道利用率 2. GBN、SR协议的信道利用率 3.术语补充 3.1 滑动窗口协议 3.2 ARQ协议、连续ARQ协议 4. 信道划分介质访问控制 4.1 时分复用&#xff08;TDM&#xff09; 4.2 统计时分复用&#xff08;STDM&#xff09; 4.3 频分复用&#xff08;FDM&a…

VUE集成Live2d

VUE集成Live2d 目前基于大模型&#xff0c;可以实现一个桌面的3D动画小人&#xff0c;个人猜测可以简介这个项目进行实现 1-参考网址 试了很多项目&#xff0c;只有这个项目直观的把问题说清楚了 Live2D Vue3技术应用:https://blog.csdn.net/hh1233321/article/details/1406947…

C++蓝桥杯基础篇(七)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来一起学习蓝桥杯基础篇&#xff08;七&#xff09;&#xff0c;学习相关字符串的知识&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 一、字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的…

el-input实现金额输入

需求&#xff1a;想要实现一个输入金额的el-input&#xff0c;限制只能输入数字和一个小数点。失焦数字转千分位&#xff0c;聚焦转为数字&#xff0c;超过最大值&#xff0c;红字提示 效果图 失焦 聚焦 报错效果 // 组件limitDialog <template><el-dialog:visible.s…

双碳战略下的智慧能源实践:安科瑞储能管理系统助力企业绿色转型

在全球碳中和目标加速推进的背景下&#xff0c;中国“十四五”规划明确提出构建以新能源为主体的新型电力系统&#xff0c;储能技术成为支撑能源结构转型的核心要素。安科瑞储能能量管理系统作为企业级智慧能源解决方案的核心载体&#xff0c;凭借其技术创新与场景适配能力&…

《鸢尾花数学大系:从加减乘除到机器学习》开源资源

《鸢尾花数学大系&#xff1a;从加减乘除到机器学习》开源资源 Gitee&#xff1a;https://gitee.com/higkoo/ bilibili&#xff1a;https://space.bilibili.com/513194466 GitHub&#xff1a;https://github.com/Visualize-ML

本地部署HDFS集群

首先完成本地部署大数据集群前置准备&#xff0c;可参考&#xff1a; 本地部署大数据集群前置准备https://blog.csdn.net/m0_73641796/article/details/145994787?spm1001.2014.3001.5501 1.下载hadoop 下载Hadoop安装包&#xff0c;本文用的是hadoop-3.3.4.tar.gz 2. 集群…

10.【线性代数】—— 四个基本子空间

十、 四个基本子空间 1. 列空间 C ( A ) C(A) C(A) in R m R^m Rm2. 零空间 N ( A ) N(A) N(A) in R n R^n Rn3. 行空间 C ( A T ) C(A^T) C(AT) in R n R^n Rn4. 左零空间 N ( A T ) N(A^T) N(AT) in R m R^m Rm综述5. 新的向量空间 讨论矩阵 A m ∗ n A_{m*n} Am∗n​…

基于vue框架的游戏商城系统cq070(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,分类,商品信息,游戏高手,游戏代练 开题报告内容 基于Vue框架的游戏商城系统开题报告 一、研究背景与意义 随着互联网技术的飞速发展和游戏产业的蓬勃兴起&#xff0c;游戏商城作为游戏产业链中的重要一环&#xff0c;迎来了前所…

我代表中国受邀在亚马逊云科技全球云计算大会re:Invent中技术演讲

大家好我是小李哥&#xff0c;本名叫李少奕&#xff0c;目前在一家金融行业公司担任首席云计算工程师。去年5月很荣幸在全球千万名开发者中被选为了全球亚马逊云科技认证技术专家&#xff08;AWS Hero&#xff09;&#xff0c;是近10年来大陆地区仅有的第9名大陆专家。同时作为…

css3d放置的面板方向不对问题排查

以往在threejs左手坐标系下&#xff0c;cameranew THREE.Vector3(0, 0, 1)&#xff0c;好像在贴css3d的时候从来不会出问题。而这次接到一个朋友是用右手坐标系的&#xff0c;camera默认不设置方向&#xff0c;则应该是&#xff08;0&#xff0c;1&#xff0c;0&#xff09; c…

网络安全法与等级保护 PPT 精华汇总

资源描述 本资源文件为《网络安全法与等级保护》的PPT精华汇总&#xff0c;内容涵盖了网络安全法与等级保护的总体框架及相关标准规范。该PPT详细介绍了网络安全法与等级保护的各个章节和条款&#xff0c;并提供了基础类和应用类的相关标准文件&#xff0c;帮助读者全面了解和…

探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比

文章目录 三、算法在现代通信系统中的应用3.1 5G 通信中的应用3.1.1 信道编码与调制解调3.1.2 大规模 MIMO 技术3.1.3 案例分析&#xff1a;5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析&#xff1a;卫星通信系统实例…

io学习----->标准io

思维导图&#xff1a; 一.io的作用 io是实现对文件的操作&#xff0c;把运行结果存到文件中&#xff0c;读取文件的数据&#xff0c;方便后期查询。 二.io的概念 io是指系统 和外部设备或用户之间的数据交互 I:input 表示数据从外部设备输入到内存中&#xff1b; O:output…