程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了CRC 以 16 位存储,有一个额外值表示未初始化的 crc 值?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

开发过程中遇到CRC 以 16 位存储,有一个额外值表示未初始化的 crc 值?的问题如何解决?下面主要结合日常开发的经验,给出你关于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 字节的错误率非常低,从实际角度来看可能无关紧要。

大佬总结

以上是大佬教程为你收集整理的CRC 以 16 位存储,有一个额外值表示未初始化的 crc 值?全部内容,希望文章能够帮你解决CRC 以 16 位存储,有一个额外值表示未初始化的 crc 值?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。