Running checksum/CRC
时间: 2023-07-24 19:15:04 浏览: 47
Running checksum/CRC(运行校验和/循环冗余校验)是一种校验算法,用于检测数据传输或存储中的错误或损坏。
Running checksum是一种简单的累加校验和算法。它通过将数据流中的每个字节相加,并保留累加和的低位字节作为校验和。在接收端,接收到的数据也按照相同的算法进行校验和计算。如果发送端和接收端的校验和不一致,就表示数据传输中出现了错误。
CRC是一种更复杂的循环冗余校验算法。它通过使用除法运算来生成一个固定长度的校验码。发送端将数据按照CRC算法进行计算,并将校验码附加在数据的末尾。接收端收到数据后,也使用相同的CRC算法进行计算,并将计算得到的校验码与接收到的校验码进行比较。如果两者不一致,就表示数据传输中存在错误。
Running checksum和CRC在数据传输或存储中起到了保护和检测数据完整性的作用。它们广泛应用于通信协议、文件传输、存储系统等领域。CRC相比于Running checksum更复杂,能够提供更高的错误检测能力,但也需要更多的计算和存储资源。选择使用哪种校验算法取决于具体的应用场景和对数据完整性的要求。
相关问题
解释代码static etError SHT3X_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum) { uint8_t crc; // calculated checksum // calculates 8-Bit checksum crc = SHT3X_CalcCrc(data, nbrOfBytes); // verify checksum if(crc != checksum) return CHECKSUM_ERROR; else return NO_ERROR; }
这段代码是一个函数 `SHT3X_CheckCrc` 的实现,它的作用是对给定的数据进行校验,并与给定的校验码进行比较。下面是对代码的解释:
1. `etError` 是一个枚举类型,表示错误码。
2. `uint8_t data[]` 是一个数组,用于存储需要进行校验的数据。
3. `uint8_t nbrOfBytes` 是一个表示需要校验的字节数的值。
4. `uint8_t checksum` 是一个表示校验码的值。
5. `uint8_t crc` 是一个变量,用来存储计算得到的校验码。
6. 首先,通过调用 `SHT3X_CalcCrc` 函数计算给定数据的 8 位校验码,并将结果存储在 `crc` 变量中。
7. 然后,将计算得到的校验码 `crc` 与给定的校验码 `checksum` 进行比较。
8. 如果两者不相等,则返回错误码 `CHECKSUM_ERROR`,表示校验失败。
9. 如果两者相等,则返回错误码 `NO_ERROR`,表示校验通过。
checksum 和 CRC的优缺点
1. checksum的优点:
- 计算简单,速度快;
- 检错能力强,能够检测出大多数单比特差错和多比特差错。
2. checksum的缺点:
- 无法检测出所有错误,存在一定的漏检率;
- 对于连续出现的差错,可能会误判为正确数据;
- 对于数据包长度不等的情况,需要重新计算校验和,增加了传输时的开销。
3. CRC的优点:
- 比checksum检测能力更强,能够检测出更多的错误;
- 对于连续出现的差错,能够进行更准确的判断;
- 不受数据包长度影响,计算复杂度不随数据包长度增加而增加。
4. CRC的缺点:
- 计算复杂,速度较慢;
- 需要占用较多的存储空间,需要存储生成多项式、预处理表等信息;
- 对于某些特殊情况(如比特反转),可能会出现误判。