CRC存储在16位中,其中一个额外值指示未初始化的CRC值



出于功能安全原因,我需要存储crc-16或类似数据以保护数据。数据长度最多可达80字节。我需要使用16位值中的一个值来表示,数据是故意修改的,crc还没有计算出来。

据我所知,16位值的每个值都可能是CRC-16的结果。没有未使用的值可以指示";未初始化";。

什么是最好的解决方案?

  • take";0";作为未初始化的值;1〃;如果计算得出";0";

  • 使用较小的CRC,例如CRC-15

  • 有更好的解决方案吗?

我使用C和C++,但这不应该起到很大作用。

更新,考虑到rcgldr使用CRC-15的建议:我将计算CRC-15值(为0..32767(或值65432,该值应指示应检查数据并计算CRC。我不想只使用1位或0x0000或0xFFFF来使crc无效,因为这些位模式比奇数更有可能发生,在crc-15的有效范围之外,比如65432。

考虑到Adler的建议:我计算CRC-16,如果值为65432,则写入例如0xFFFF。65432因此被保留用于指示修改。

我觉得CRC-15看起来更干净,但阿德勒说得对,我泄露了信息。另一方面,我的数据(校准数据(存储在内存中,比特错误的可能性不像通过串行接口传输数据那样大(这将受到单独保护(。未检测到错误的几率约为1:32767。

您的第一个选项。通过将CRC值0映射到1,可以保留16位CRC的大部分功率。然后,值1的出现频率是其他非零值的两倍,而0从未出现。这稍微削弱了CRC检测错误的能力,现在您已经释放了零值来指示CRC尚未计算。

将整个比特用于该指示将CRC的功率(由假阳性的概率表示(减弱了2倍。

由于不知道CRC未初始化(计算(的原因或频率、预期错误率以及如何处理未初始化的CRC,我不知道该推荐什么。

take"0";作为未初始化的值;1〃;如果计算得出";0

0和1都可能是有效和无效的(指示错误(CRC 16值,但正如Mark Adler所回答的那样,它只是略微削弱了CRC,因为计算出的0或1的CRC都映射到1。当接收到数据,并且仅对数据重新计算CRC时,如果消息CRC==1,则代码将接受重新计算的0或1的CRC,以指示没有错误。

使用较小的CRC,例如CRC-15

使用15位CRC和标志位来指示是否计算了15位CRC。正如Mark Adler所回答的,这比0和1映射到1要弱,但如果82字节的错误率非常低,从实际角度来看可能无关紧要。

最新更新