微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CRC 以 16 位存储,有一个额外值表示未初始化的 crc 值?

如何解决CRC 以 16 位存储,有一个额外值表示未初始化的 crc 值?

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

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

最好的解决方案是什么?

  • 如果计算结果为“0”,则取“0”作为未初始化的值并存储“1”

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

  • 有更好的解决方案吗?

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

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

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

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

解决方法

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

为该指示取一整位会削弱 CRC 的能力,这由误报的概率表示,减少了两倍。

,

不知道为什么或多久未初始化(计算)CRC、预期错误率以及如何处理未初始化的CRC,我不确定推荐什么。

如果计算结果为“0”,则取“0”作为未初始化的值并存储“1”

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。