CRC 的基本概念CRCCyclic Redundancy Check是一种用于检测数据传输或存储过程中错误的校验算法。它通过生成一个固定长度的校验码通常为16位或32位附加在原始数据后接收方通过重新计算校验码来验证数据完整性。CRC 的工作原理数据被视为一个二进制多项式例如数据0x34二进制00110100对应多项式[ x^5 x^4 x^2 ]发送方和接收方预先约定一个生成多项式如CRC-16的x^{16} x^{15} x^2 1。发送方将数据多项式除以生成多项式得到的余数作为校验码附加到数据末尾。常见 CRC 标准CRC-8生成多项式x^8 x^2 x 1用于简单通信协议。CRC-16生成多项式x^{16} x^{15} x^2 1常用于Modbus协议。CRC-32生成多项式x^{32} x^{26} x^{23} \cdots x 1用于以太网、ZIP等。CRC 计算步骤数据填充在原始数据末尾补n个零n为生成多项式位数减1。模2除法用填充后的数据除以生成多项式忽略商保留余数。附加校验码将余数替换掉填充的零作为最终传输数据。代码示例Pythondef crc_remainder(data, poly): data bytearray(data) crc 0 for byte in data: crc ^ byte for _ in range(8): if crc 0x80: crc (crc 1) ^ poly else: crc 1 return crc 0xFF # 以CRC-8为例 # 示例计算CRC-8生成多项式0x07 data b\x34 poly 0x07 print(hex(crc_remainder(data, poly)))应用场景网络通信以太网帧校验CRC-32。存储系统检测磁盘或文件传输错误。嵌入式系统传感器数据校验CRC-16。优缺点优点检测能力强可识别单比特、多比特和突发错误。缺点无法纠错仅能检测错误计算复杂度高于简单校验和。通过合理选择生成多项式和实现优化CRC可高效保障数据可靠性。
芯片开发学习笔记·二十八——CRC(循环冗余校验)
发布时间:2026/6/4 3:55:20
CRC 的基本概念CRCCyclic Redundancy Check是一种用于检测数据传输或存储过程中错误的校验算法。它通过生成一个固定长度的校验码通常为16位或32位附加在原始数据后接收方通过重新计算校验码来验证数据完整性。CRC 的工作原理数据被视为一个二进制多项式例如数据0x34二进制00110100对应多项式[ x^5 x^4 x^2 ]发送方和接收方预先约定一个生成多项式如CRC-16的x^{16} x^{15} x^2 1。发送方将数据多项式除以生成多项式得到的余数作为校验码附加到数据末尾。常见 CRC 标准CRC-8生成多项式x^8 x^2 x 1用于简单通信协议。CRC-16生成多项式x^{16} x^{15} x^2 1常用于Modbus协议。CRC-32生成多项式x^{32} x^{26} x^{23} \cdots x 1用于以太网、ZIP等。CRC 计算步骤数据填充在原始数据末尾补n个零n为生成多项式位数减1。模2除法用填充后的数据除以生成多项式忽略商保留余数。附加校验码将余数替换掉填充的零作为最终传输数据。代码示例Pythondef crc_remainder(data, poly): data bytearray(data) crc 0 for byte in data: crc ^ byte for _ in range(8): if crc 0x80: crc (crc 1) ^ poly else: crc 1 return crc 0xFF # 以CRC-8为例 # 示例计算CRC-8生成多项式0x07 data b\x34 poly 0x07 print(hex(crc_remainder(data, poly)))应用场景网络通信以太网帧校验CRC-32。存储系统检测磁盘或文件传输错误。嵌入式系统传感器数据校验CRC-16。优缺点优点检测能力强可识别单比特、多比特和突发错误。缺点无法纠错仅能检测错误计算复杂度高于简单校验和。通过合理选择生成多项式和实现优化CRC可高效保障数据可靠性。