【问题标题】:Is there a simple way to make a CRC checksum match a given value?是否有一种简单的方法可以使 CRC 校验和与给定值匹配?
【发布时间】:2018-08-21 14:54:21
【问题描述】:

我正在开发一个在微控制器上运行的程序,需要对程序代码完整性进行自检。

为此,我让代码计算整个闪存(程序空间)的 CRC16 校验和,并通过某个网络将该值传输到另一个系统。然后,另一个系统必须将校验和与预先计算的值进行比较。

但是,每次更新时,CRC 值都会发生变化。所以整个过程可以简化,如果程序代码可以预先准备好,这样 CRC16 校验和总是匹配一个预定义的值,比如 0,或者更好的值,比如 0x1234。

有没有简单的方法来实现这一点?

另一种说法:我能否轻松计算一个字节序列,我必须将其添加到我的程序二进制代码中(例如,通过更改程序中包含的虚拟数据的静态数组),以便 CRC16 给出我的预定义值? 这个字节序列可以包含在代码中的任何地方还是必须正好在末尾?

(如果需要,我还可以实现除 CRC-16 之外的另一种校验和算法。)

感谢您的回答!

【问题讨论】:

    标签: crc integrity crc16


    【解决方案1】:

    是的,很容易。对于您的 n 字节闪存,计算前 n-2 个字节的 CRC-16,并将该 CRC 存储在最后两个字节中。对于反射 CRC,这两个字节将以小端顺序附加,对于非反射 CRC,将以大端顺序附加。那么 n 个字节的 CRC-16 将是一个常数。该常数被称为 CRC 的“残差”。对于末尾没有异或的 CRC,余数始终为零。您没有说您使用的是什么 CRC,但您可以在 Greg Cook's catalog 中找到已知 CRC 的残基(在最终异或之前)。或者你可以看看你得到了什么。

    【讨论】:

    • 太棒了!感谢您快速而完美的回答!
    猜你喜欢
    • 1970-01-01
    • 2017-04-29
    • 2012-09-07
    • 1970-01-01
    • 2011-10-17
    • 2020-05-04
    • 2020-11-23
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多