校验和简介
校验和(Checksum)是一种简单的错误检测方法,用于验证数据的完整性。其原理是在发送数据时,计算数据的校验和,并将其附加到
数据中。接收方在接收数据后,同样计算接收到的数据的校验和,然后与附加的校验和进行比较,以判断数据是否在传输过程中发生了错误。
开发过程中,对帧数据的校验是常见的,下面是一个常见的简单的计算单字节校验和的函数。
单字节校验和的原理
单字节校验和是一种简单的校验和算法,用于验证数据的完整性。其原理是对数据中的每个字节进行累加,然后将结果取模(或取余)操作,
以得到一个字节大小的校验和值。
下面是单字节校验和的基本原理:
数据分割:将待发送的数据分割成一个个字节。
累加求和:对每个字节进行累加操作,将每个字节的值加到一个初始值(通常为0)上。
取模运算:对累加得到的结果进行取模操作,通常是取模256,以确保结果在0到255之间。
得到校验和:取模运算的结果即为校验和。
发送数据:将原始数据与计算得到的校验和一起发送给接收方。
接收数据:接收方收到数据后,同样对接收到的数据进行单字节校验和的计算。
校验:接收方将计算得到的校验和与接收到的数据中附加的校验和进行比较。如果两者一致,则认为数据在传输过程中没有发生错误;
否则,可以假设数据发生了错误,需要进行相应的处理,比如请求重传或者丢弃数据。
由于单字节校验和只是简单地对数据进行累加和操作,因此它的实现非常简单,但是相对来说也比较容易受到数据中某些特定模式的影响,
因此在实际应用中可能不够可靠。在一些情况下,会使用更复杂的校验和算法,比如循环冗余校验(CRC),以提高数据传输的可靠性
和安全性。
单字节校验和的实现
传入的是单字节,16进制数
得到的校验和结果:十六进制,单字节的结果
/**
* @brief 计算单字节的校验和
* @param[in] buf 需要校验的buf
* @param[in] len 需要校验的buf长度
* @return 返回
* @retval 校验和
*/
rt_uint8_t CalChecksum8(const rt_uint8_t *buf, int len)
{
rt_uint8_t sum = 0;
for (int i = 0; i < len; i++) {
sum += *(buf + i);
}
sum = sum % 256;
return sum;
}
传入的是单字节,16进制数
得到的校验和结果:十进制,多字节(高位在前,低位在后)的结果
/**
* @brief 计算单字节的校验和
* @param[in] buf 需要校验的buf
* @param[in] len 需要校验的buf长度
* @return 返回
* @retval 校验和
*/
rt_uint8_t CalChecksum8(const rt_uint8_t *buf, int len)
{
rt_uint8_t sum = 0;
for (int i = 0; i < len; i++) {
sum += *(buf + i);
}
return sum;
}
XOR-8/BCC校验
XOR-8/BCC 校验码是一种简单的错误检测机制,常用于数据通信中,以确保信息在传输过程中没有被篡改或损坏。
以下是对 XOR-8 和 BCC 的解释:
XOR-8 (Exclusive OR 8-bit)
XOR-8 是一种使用异或操作(XOR)来计算 8 位校验码的方法。它通过对一组数据字节逐个进行异或运算生成一个单独的 8 位值。
具体步骤如下:
初始化校验码:通常初始化为 0。
逐字节处理数据:将每个数据字节与当前校验码进行异或运算。
得到最终校验码:处理完所有数据字节后,得到的结果即为校验码。
XOR-8/BCC校验的实现
/**
* @brief 计算XOR-8/BCC校验码
* @param[in] buf 校验数据指针
* @param[in] len 校验数据长度
* @return 返回XOR-8/BCC校验码
*/
uint8_t CalculateXor(const char *buf, int len)
{
uint8_t sum = 0;
for (int i = 0; i < len; i++) {
sum ^= buf[i];
}
return sum;
}
这是一个好用的多种校验的工具
http://xnkiot.com/#/sum