有没有一种简单的方法可以使 CRC 校验和与给定值匹配?

Is there a simple way to make a CRC checksum match a given value?

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

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

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

有没有简单的方法可以做到这一点?

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

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

感谢您的回答!

是的,很容易。对于闪存的 n 字节,计算前 n-2 字节的 CRC-16,并将该 CRC 存储在最后两个字节中。这两个字节将以 little-endian 的顺序附加到反映的 CRC 中,并以 big-endian 的顺序附加到 non-reflected CRC 中。然后 n 字节的 CRC-16 将是一个常量。该常数称为 CRC 的 "residue"。对于末尾没有 exclusive-or 的 CRC,余数始终为零。您没有说明您使用的是什么 CRC,但是您可以在 Greg Cook's catalog 中找到已知 CRC 的残基(在最终 exclusive-or 之前)。或者你可以看看你得到了什么。