如何为简单的 C++ 程序选择正确的校验和,以及如何实现它?

How do I choose the right checksum for a simple C++ program, and how do I implement it?

我对校验和很陌生,对编程也很陌生。我有一个相当简单的 C++ 程序(测量 psi),我正在将其传输到 Arduino 板上。 crc16 可以吗,还是我应该使用 crc32 还是太过分了?

校验和出现在不可靠的通信渠道的上下文中。通信通道是一种抽象;位进入一端并从另一端出来。 不可靠 通道仅表示输出的位与输入的位不同。

现在很明显,最不可靠的频道出现了随机比特。那是不可用的,所以我们关注输入和输出相关的通道。

不过,我们有许多不同的腐败模式。一个常见的模型是每一位都有 P% 的可能失败。另一种常见模型认为误码通常是突发的。然后每一位都有 P% 的机会开始一连串长度为 N 的错误,其中每一位有 50% 的可能性是错误的。存在更多的模型,具体取决于您的问题 - 更高级的模型还会考虑位完全丢失的可能性。

正确的校验和很有可能检测到模型预测的错误类型,但可能不适用于其他类型的错误。

例如,我认为对于 Internet IP 层,最常见的错误是整个 IP 数据包丢失。这就是 TCP 使用序列号来检测此特定错误的原因。

一种检查可执行文件是否已正确传输到您的 Arduino 板的可能方法是使用简单的校验和,例如 md5, or even something even simpler, like some crude hash function computing a 16 bit hash. See e.g. this answer 以获取灵感。