嵌入式软件常用的校验算法

💡 原文中文,约2100字,阅读约需5分钟。
📝

内容提要

UART通信使用奇偶校验,CAN通信使用CRC校验。Modbus、MAVlink、USB等通信协议也包含校验信息。校验和和异或校验是常见的校验算法,CRC校验是最常用的查错校验码。MD5算法用于加密和验证文件。还有其他校验算法如SM3和SHA-1。

🔎

延伸解读

校验算法在嵌入式通信中的角色

文章指出UART使用奇偶校验,CAN使用CRC校验,而Modbus、MAVlink、USB等协议也包含校验信息。这说明校验是通信协议的基本组成部分,用于检测传输错误。在自定义数据存储时,有经验的工程师也会添加校验信息以保证数据完整性。因此,理解不同校验算法的特点有助于在嵌入式开发中做出合适选择。

简单校验算法的实现与局限

校验和与异或校验是两种最基本的校验算法,实现简单,只需几行代码即可完成。文章给出了C语言示例,并提到实际应用需结合项目情况修改。这类算法计算量小,适合资源受限的嵌入式环境,但检错能力有限,通常用于对错误检测要求不高的场景。

CRC校验的变体与嵌入式应用

CRC是数据通信中最常用的查错校验码,具有多种变体,如CRC-1、CRC-5-USB、CRC-8、CRC-16、CRC-32、CRC-64等。文章特别提到在嵌入式领域CRC-16用得比较多,并给出了单片机上的实现示例和开源库参考。不同场景下CRC的实现方式不同,开发者可根据需求选择现成库或在线工具。

MD5与其他校验算法的用途

MD5算法通过采集文件信息摘要并加密,生成唯一的128位散列值,常用于验证文件完整性和密码加密。文章还提到SM3和SHA-1等其他算法,其中SM3用于密码相关开发,SHA-1从MD4改进而来。这些算法适用于特定领域,开发者可根据安全需求选择。

❓

Q&A

UART和CAN通信分别使用什么校验方式?

UART通信使用奇偶校验,CAN通信使用CRC校验。

校验和算法有什么特点?如何用C语言实现8位校验和?

校验和是最基本、最常用的嵌入式校验算法,实现简单,只需几行代码。8位校验和的C语言实现示例:uint8_t CheckSum(uint8_t *Buf, uint8_t Len) { uint8_t i = 0; uint8_t sum = 0; uint8_t checksum = 0; for (i=0; i<Len; i++) { sum += Buf[i]; } checksum = sum; return checksum; }(注意:原文代码不完整,此处根据描述补全)。

异或校验是如何工作的?

异或校验与校验和类似,对数据进行异或运算,最终得到一个异或值作为校验值。C语言实现示例:uint8_t CheckXOR(uint8_t *Buf, uint8_t Len) { uint8_t i = 0; uint8_t x = 0; for (i=0; i<Len; i++) { x ^= Buf[i]; } return x; }(注意:原文代码不完整,此处根据描述补全)。

CRC校验是什么?在嵌入式领域常用哪种变体?

CRC即循环冗余校验,是数据通信领域最常用的查错校验码,通过对数据进行多项式计算并将结果附在帧后,接收设备执行类似算法以保证数据传输的正确性和完整性。CRC有多种变体,如CRC-1、CRC-5-USB、CRC-8、CRC-16、CRC-32、CRC-64等,在嵌入式领域CRC-16用得比较多。

MD5算法有什么用途?它是如何工作的?

MD5即信息-摘要算法5,主要用于加密和验证文件。它通过采集文件信息摘要进行计算加密,生成一个唯一的128位MD5值,如同文件的指纹,可用于验证文件是否正确或密码是否匹配。MD5输入不定长度信息,输出固定长度128-bits,生成四个32位数据联合成128-bits散列。

除了校验和、异或校验、CRC和MD5,还有哪些校验算法?

还有SM3密码杂凑算法(由密码管理局发布,用于密码相关开发)和SHA-1算法(安全散列算法1,从MD4改进而来)。

🏷️

标签

➡️

继续阅读