dedecms企业网站模板免费下载,wordpress媒体库现实不全,鞍山市建设工程安全生产监督管理站网站,北京网络推广文章目录 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 总结#xff1a;CRC校… 文章目录 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调制/解调。其他博客链接如下
探秘基带算法从原理到5G时代的通信变革【一】引言探秘基带算法从原理到5G时代的通信变革【二】Viterbi解码探秘基带算法从原理到5G时代的通信变革【三】Turbo 编解码探秘基带算法从原理到5G时代的通信变革【四】Polar 编解码一探秘基带算法从原理到5G时代的通信变革【四】Polar 编解码二探秘基带算法从原理到5G时代的通信变革【五】CORDIC算法探秘基带算法从原理到5G时代的通信变革【六】CRC 校验探秘基带算法从原理到5G时代的通信变革【七】FFT/DFT探秘基带算法从原理到5G时代的通信变革【八】QAM 调制 / 解调探秘基带算法从原理到5G时代的通信变革【九】QPSK调制/解调探秘基带算法从原理到5G时代的通信变革【十】基带算法应用与对比
2.5 CRC 校验
[CRC校验]手算与直观演示_哔哩哔哩_bilibili讲解的非常清楚。一定要先看这个
2.5.1 前言
在现代通信系统中数据传输的完整性是确保信息正确传递的关键。一个完整的数据帧通常由多个部分构成包括帧头、数据位和帧尾等。其中校验位的作用尤为重要它通过对原始数据进行特定算法计算生成一个校验值并将其附加到数据帧中。接收方接收到数据后使用相同的算法对原始数据重新计算校验值并与接收到的校验值进行比较。如果两者一致则说明数据在传输过程中未发生错误否则表明数据可能被篡改或损坏需要丢弃并请求重发。 常见的校验算法包括奇偶校验、校验和、循环冗余校验Cyclic Redundancy CheckCRC以及较少使用的纵向冗余校验Longitudinal Redundancy CheckLRC和块校验码Block Check CharacterBCC。然而不同的校验方法具有各自的优缺点。例如奇偶校验是一种简单但误码率较高的校验方式。以串口通信中的奇校验为例假设原始数据为0001 0011其中1的个数为3因此奇校验位为0。如果传输过程中数据受到干扰接收端接收到的数据变为0010 0011尽管1的个数仍为奇数校验通过但实际上数据已经发生了错误。类似的问题也可能出现在校验和算法中。 为了提高数据传输的健壮性和稳定性通信系统通常结合高效的校验算法和数字信号编码方式。例如以太网协议采用了CRC-32校验和曼彻斯特编码。这种组合能够显著降低误码率确保数据的可靠传输。本文将重点介绍CRC校验的原理及其具体实现方法。 2.5.2 CRC算法简介
循环冗余校验Cyclic Redundancy CheckCRC是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
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 x8x2x1二进制为1 0000 0111省略最高位1转换为十六进制为0x07。INITCRC初始值和WIDTH位宽一致。REFINtrue或false在进行计算之前原始数据是否翻转如原始数据0x34 0011 0100如果REFIN为true进行翻转之后为0010 1100 0x2c。REFOUTtrue或false运算完成之后得到的CRC值是否进行翻转如计算得到的CRC值0x97 1001 0111如果REFOUT为true进行翻转之后为11101001 0xE9。XOROUT计算结果与此参数进行异或运算后得到最终的CRC值和WIDTH位宽一致。
通常如果只给了一个多项式其他的没有说明则INIT0x00REFINfalseREFOUTfalseXOROUT0x00。 常用的21个标准CRC参数模型
以下是常用的21个标准CRC参数模型
CRC算法名称多项式公式WIDTHPOLYINITXOROUTREFINREFOUTCRC-4/ITU x 4 x 1 x^4 x 1 x4x14030000TRUETRUECRC-5/EPC x 5 x 3 1 x^5 x^3 1 x5x315090900FALSEFALSECRC-5/ITU x 5 x 4 x 2 1 x^5 x^4 x^2 1 x5x4x215150000TRUETRUECRC-5/USB x 5 x 2 1 x^5 x^2 1 x5x215051F1FTRUETRUECRC-6/ITU x 6 x 1 x^6 x 1 x6x16030000TRUETRUECRC-7/MMC x 7 x 3 1 x^7 x^3 1 x7x317090000FALSEFALSECRC-8 x 8 x 2 x 1 x^8 x^2 x 1 x8x2x18070000FALSEFALSECRC-8/ITU x 8 x 2 x 1 x^8 x^2 x 1 x8x2x18070055FALSEFALSECRC-8/ROHC x 8 x 2 x 1 x^8 x^2 x 1 x8x2x1807FF00TRUETRUECRC-8/MAXIM x 8 x 5 x 4 1 x^8 x^5 x^4 1 x8x5x418310000TRUETRUECRC-16/IBM x 16 x 15 x 2 1 x^{16} x^{15} x^2 1 x16x15x2116800500000000TRUETRUECRC-16/MAXIM x 16 x 15 x 2 1 x^{16} x^{15} x^2 1 x16x15x211680050000FFFFTRUETRUECRC-16/USB x 16 x 15 x 2 1 x^{16} x^{15} x^2 1 x16x15x21168005FFFFFFFFTRUETRUECRC-16/MODBUS x 16 x 15 x 2 1 x^{16} x^{15} x^2 1 x16x15x21168005FFFF0000FALSEFALSECRC-16/CCITT x 16 x 12 x 5 1 x^{16} x^{12} x^5 1 x16x12x5116102100000000TRUETRUECRC-16/CCITT-FALSE x 16 x 12 x 5 1 x^{16} x^{12} x^5 1 x16x12x51161021FFFF0000FALSEFALSECRC-16/X25 x 16 x 12 x 5 1 x^{16} x^{12} x^5 1 x16x12x51161021FFFFFFFFTRUETRUECRC-16/XMODEM x 16 x 12 x 5 1 x^{16} x^{12} x^5 1 x16x12x5116102100000000FALSEFALSECRC-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 x16x13x12x11x10x8x6x5x21163D650000FFFFTRUETRUECRC-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 x32x26x23x22x16x12x11x10x8x7x5x4x2x13204C11DB7FFFFFFFFFFFFFFFFTRUETRUECRC-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 x32x26x23x22x16x12x11x10x8x7x5x4x2x13204C11DB7FFFFFFFF0FALSEFALSE
这些参数模型定义了不同应用场景下的CRC校验方法确保了在特定协议或标准下数据传输的可靠性和一致性。 CRC校验在电子通信中的广泛应用
循环冗余校验Cyclic Redundancy CheckCRC是一种广泛应用于电子通信领域的数据完整性检测技术。其高效性和可靠性使其成为现代通信系统中不可或缺的一部分。无论是芯片级的单总线通信还是大规模的数据传输协议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 x8x5x41十六进制表示为0x31。初始值0x00。输入翻转REFINTRUE表示在计算前需要对输入数据进行比特级翻转。输出翻转REFOUTTRUE表示计算结果需要再次翻转。异或值XOROUT0x00。
通过这些参数的组合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 x7x31十六进制表示为0x09。初始值0x00。输入翻转REFINFALSE。输出翻转REFOUTFALSE。异或值XOROUT0x00。
由于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 x16x15x21十六进制表示为0x8005。初始值0xFFFF。输入翻转REFINFALSE。输出翻转REFOUTFALSE。异或值XOROUT0x0000。
CRC-16/MODBUS模型通过较高的位宽提供了更强的错误检测能力适合工业环境中复杂数据帧的校验需求。 USB协议中的CRC-5/USB和CRC-16/USB模型
USBUniversal Serial Bus协议中使用了两种不同的CRC模型来满足不同场景的需求 CRC-5/USB用于短数据包的快速校验常见于握手信号和令牌包。 多项式 x 5 x 2 1 x^5 x^2 1 x5x21十六进制表示为0x05。初始值0x1F。输入翻转REFINTRUE。输出翻转REFOUTTRUE。异或值XOROUT0x1F。 CRC-16/USB用于数据包的完整校验适合大规模数据传输。 多项式 x 16 x 15 x 2 1 x^{16} x^{15} x^2 1 x16x15x21十六进制表示为0x8005。初始值0xFFFF。输入翻转REFINTRUE。输出翻转REFOUTTRUE。异或值XOROUT0xFFFF。
这两种模型的结合使得USB协议能够在保证速度的同时兼顾可靠性。 图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 x32x26x23x22x16x12x11x10x8x7x5x4x2x1十六进制表示为0x04C11DB7。初始值0xFFFFFFFF。输入翻转REFINTRUE。输出翻转REFOUTTRUE。异或值XOROUT0xFFFFFFFF。
通过硬件加速STM32能够在不占用过多CPU资源的情况下完成复杂的CRC计算显著提高了系统的性能。 图STM32硬件CRC模块的工作原理。 2.5.3 CRC计算的详细过程
在电子通信领域CRC校验是一种广泛使用的数据完整性检测技术。为了更好地理解CRC校验的工作原理我们可以通过一个具体的例子来手算CRC值并逐步解析其计算过程。 问题描述
假设原始数据为0x34使用CRC-8/MAXIM参数模型计算CRC值。根据CRC-8/MAXIM的参数模型我们可以提取以下信息
POLY 0x31 0011 0001最高位1已省略INIT 0x00XOROUT 0x00REFIN TRUE输入数据需要翻转REFOUT TRUE输出结果需要翻转
有了这些参数我们就可以开始详细的计算过程。 计算步骤
1第一步初始化
原始数据为0x34对应的二进制表示为0011 0100。初始值INIT为0x00因此原始数据与初始值进行异或运算后保持不变 原始数据 ⊕ INIT 0011 0100 ⊕ 0000 0000 0011 0100 \text{原始数据} \oplus \text{INIT} 0011\ 0100 \oplus 0000\ 0000 0011\ 0100 原始数据⊕INIT0011 0100⊕0000 00000011 0100 2第二步输入数据翻转
由于REFIN TRUE我们需要对原始数据进行比特级翻转。翻转后的结果为 0011 0100 → 0010 1100 0011\ 0100 \rightarrow 0010\ 1100 0011 0100→0010 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直到余数的长度小于多项式的阶数为止。
以下是具体的计算过程 取扩展数据的前9位因为生成多项式的阶数为81011 0000 0000。 将生成多项式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 0⊕1 0011 00010010 1000 1 将结果右移继续取下一位数据进行异或运算重复上述步骤直到处理完整个扩展数据。 最终得到的余数为1111 1011。 如果这个计算过程不理解请查看[CRC校验]手算与直观演示_哔哩哔哩_bilibili讲解的非常清楚。一定要看 5第五步输出结果翻转
由于REFOUT TRUE需要对最终结果进行比特级翻转。翻转后的结果为 1111 1011 → 1101 1111 1111\ 1011 \rightarrow 1101\ 1111 1111 1011→1101 1111 6第六步与XOROUT进行异或
将模2除法得到的余数1111 1011与XOROUT值0x00进行异或运算 1101 1111 ⊕ 0000 0000 1101 1111 0 x D F 1101\ 1111 \oplus 0000\ 0000 1101\ 1111 0xDF 1101 1111⊕0000 00001101 11110xDF 7最终结果
经过以上步骤我们得到了CRC-8/MAXIM校验值为0xDF。将该值附加到原始数据之后完整的数据帧为 0011 0100 1101 1111 34 D F 0011\ 0100\ 1101\ 1111 34DF 0011 0100 1101 111134DF 验证计算结果
为了确保计算正确性可以使用CRC计算工具或软件进行验证。如果计算结果与工具输出一致则说明我们的计算过程无误。需要注意的是不同工具可能使用不同的参数模型因此在验证时必须确保所有参数如INIT、XOROUT、REFIN、REFOUT等完全一致。 总结
通过上述手算过程我们详细解析了CRC-8/MAXIM校验值的计算方法。这一过程包括以下几个关键步骤
初始化数据并与初始值进行异或运算。根据REFIN参数决定是否对输入数据进行翻转。对扩展后的数据进行模2除法运算求得余数。根据REFOUT参数决定是否对余数进行翻转得到初步结果。根据XOROUT参数对初步结果进行异或运算得到最终结果。
CRC校验的精确性和可靠性依赖于正确的参数设置。因此在实际应用中务必仔细核对所有参数以确保计算结果的一致性。
2.5.4 CRC校验的两种方法详解
在电子通信中CRC循环冗余校验不仅用于数据传输前的错误检测码生成还用于接收端的数据校验。接收端可以通过两种方式来验证接收到的数据帧是否正确分离比较法和整体运算法。以下将详细介绍这两种方法的工作原理及其背后的数学逻辑。 分离比较法
方法概述
分离比较法的核心思想是对接收到的数据帧进行分离处理将原始数据与附加的CRC校验码分开。然后仅对原始数据重新计算CRC值并将其与接收到的CRC校验码进行比较。如果两者一致则说明数据传输无误否则数据可能在传输过程中发生了错误。
具体步骤 数据分离 假设接收到的数据帧为0011 0100 1101 1111前8位0011 0100是原始数据后8位1101 1111是CRC校验码。 重新计算CRC值 使用与发送端相同的CRC参数模型如多项式、初始值、输入输出翻转等对分离出的原始数据0011 0100重新计算CRC值。 比较结果 将重新计算得到的CRC值与接收到的CRC校验码1101 1111进行比较。如果两者相等则认为数据传输正确否则数据可能存在错误。 整体运算法
方法概述
整体运算法的核心思想是直接对整个接收到的数据帧进行CRC计算。由于数据帧是由原始数据左移 n n n位并附加CRC值构成的因此如果数据帧没有发生错误直接对其进行CRC计算的结果应该为0。 通俗解释与举例说明 为了更好地理解“数据帧是由原始数据左移 n n n位并附加CRC值构成的因此如果数据帧没有发生错误直接对其进行CRC计算的结果应该为0”这句话我们可以从一个简单的例子出发并结合CRC校验的基本原理进行说明。 背景知识回顾 CRC计算的核心思想 CRC校验本质上是一种基于模2除法的算法。发送端通过将原始数据左移 n n n位其中 n n n是CRC值的位数然后用生成多项式 P P P对扩展后的数据进行模2除法运算得到余数作为CRC值。最终将CRC值附加到原始数据后面形成完整的数据帧。 数据帧的结构 数据帧的形式可以表示为 T D ⋅ x n R T D \cdot x^n R TD⋅xnR 其中 D D D原始数据。 n n nCRC值的位数。 R R R通过模2除法计算得到的CRC值。 接收端的验证逻辑 接收端接收到完整数据帧后直接对整个数据帧进行CRC计算。如果数据帧在传输过程中未发生错误则整个数据帧能够被生成多项式 P P P整除余数为0。 通俗解释 假设我们有一个原始数据 D D D和一个生成多项式 P P P。发送端通过以下步骤构造数据帧 将原始数据 D D D左移 n n n位相当于给 D D D后面补了 n n n个0。对左移后的数据用生成多项式 P P P进行模2除法运算得到余数 R R R。将余数 R R R附加到原始数据 D D D后面形成完整的数据帧 T T T。 由于 T T T的设计方式 T D ⋅ x n R T D \cdot x^n R TD⋅xnR它已经满足了模2除法的关系 T m o d P 0 T \mod P 0 TmodP0 也就是说如果数据帧在传输过程中没有发生任何错误那么接收端对接收到的数据帧 T T T再次进行模2除法运算时余数必然为0。 举例说明 步骤 1定义参数 原始数据 D 0 x 34 0011 0100 D 0x34 0011\ 0100 D0x340011 0100。生成多项式 P 0 x 31 0011 0001 P 0x31 0011\ 0001 P0x310011 0001CRC-8/MAXIM。CRC值的位数 n 8 n 8 n8。 步骤 2发送端计算CRC值 将原始数据 D D D左移8位相当于在其后面补8个0 D ⋅ x 8 0011 0100 0000 0000 D \cdot x^8 0011\ 0100\ 0000\ 0000 D⋅x80011 0100 0000 0000 对左移后的数据用生成多项式 P P P进行模2除法运算得到余数 R 0 x D F 1101 1111 R 0xDF 1101\ 1111 R0xDF1101 1111。 将余数 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 TD⋅x8R0011 0100 1101 111134DF 步骤 3接收端验证 接收端接收到的数据帧为 T 34 D F 0011 0100 1101 1111 T 34DF 0011\ 0100\ 1101\ 1111 T34DF0011 0100 1101 1111。接下来直接对整个数据帧 T T T进行模2除法运算 使用生成多项式 P 0 x 31 0011 0001 P 0x31 0011\ 0001 P0x310011 0001对数据帧 T T T进行模2除法运算。计算结果表明余数为0。 这说明数据帧 T T T能够被生成多项式 P P P整除因此可以确认数据帧在传输过程中没有发生错误。 总结 通过上述例子可以看出数据帧的设计方式决定了它能够被生成多项式整除即模2除法余数为0。如果数据帧在传输过程中发生了错误例如某一位被翻转则数据帧不再满足这种关系模2除法的结果将不再是0从而可以检测出错误的发生。 具体步骤
直接计算 对接收到的完整数据帧0011 0100 1101 1111直接使用相同的CRC参数模型进行计算。检查余数 如果计算得到的余数为0则说明数据帧无误否则数据帧可能在传输过程中发生了错误。 不同位出错与余数的关系
现象描述
在实际应用中如果数据帧中的某一位或多位发生错误那么通过CRC计算得到的余数通常会与错误的位置相关联。具体来说不同位的错误会导致不同的余数而这种对应关系仅取决于所使用的CRC参数模型如生成多项式、初始值等而与原始数据无关。
数学证明
假设数据帧中的第 k k k位发生了错误则可以将错误表示为一个二进制序列 E E E其中只有第 k k k位为1其余位均为0。错误后的数据帧可以表示为 T ′ T E T T E T′TE 对 T ′ T T′进行模2除法运算时余数为 R ′ ( T E ) m o d P R (T E) \mod P R′(TE)modP 由于 T m o d P 0 T \mod P 0 TmodP0因此 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 bitsetusing 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 vectoruint8_t data) {uint8_t crc 0x00; // INIT 0x00uint8_t poly 0x31; // POLY 0x31for (auto byte : data) {uint8_t byte_ref reverse_bits(byte); // REFIN TRUEcrc ^ 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 TRUEreturn crc ^ 0x00; // XOROUT 0x00
}int main() {vectoruint8_t data {0x34}; // 输入数据uint8_t crc crc8_maxim(data);cout CRC-8/MAXIM: hex (int)crc endl;return 0;
}运行结果
CRC-8/MAXIM: dfCRC计算工具推荐 在线计算工具 网址CRC循环冗余校验在线计算_ip33.com 功能 支持多种标准CRC模型如CRC-8/MAXIM、CRC-16/CCITT等。允许用户自定义多项式、初始值、输入输出翻转等参数。提供快速验证的功能适用于开发者调试和学习。 离线计算工具 CRC_Calc v0.1.exe 功能强大支持自定义CRC算法模型。提供详细的参数配置选项便于验证自定义实现的正确性。 GCRC.exe 简单易用支持多种标准CRC模型。输出结果清晰适合快速验证。 格西CRC计算器 特点 国产软件界面友好。支持多种标准CRC模型和自定义参数。提供批量计算功能适合处理大量数据。 2.5.6 总结CRC校验的局限性与纠错原理 CRC校验的局限性
尽管CRC校验是一种高效的错误检测方法但它并不能100%保证数据的完整性。在极少数情况下可能会出现数据中有错误但CRC校验结果仍为正确的现象。这种概率与以下因素有关
CRC的位数位数越高检错能力越强。生成多项式的选择不同的多项式具有不同的检错能力标准多项式经过理论优化能够提供更高的可靠性。 纠错原理
CRC校验本身主要用于错误检测而非纠错。然而在某些特定场景下可以通过以下方式实现单一比特错误的纠正
定位错误位置利用接收到的数据帧重新计算CRC值并比较计算结果与接收到的CRC值确定错误发生的比特位置。修正错误根据错误位置翻转相应的比特恢复原始数据。
这种纠错方法的前提是错误必须是单一比特错误并且生成多项式的设计需要满足一定的数学条件如汉明距离。因此在实际应用中CRC校验更多地用于检测错误而纠错功能通常由其他专门的编码技术如Hamming码、Reed-Solomon码来实现。 通过以上分析可以看出CRC校验作为一种高效的数据完整性检测技术在现代通信和存储系统中发挥了重要作用。在实际开发中结合标准工具进行验证可以显著提高实现的可靠性同时理解其局限性和纠错原理有助于更好地应用该技术。
参考资料CRC校验原理及实现 - 知乎