我有一个 eprom,其校验和是整个 eprom 的 16 位总和。 问题在于,纠正校验和会更改已检查的数据,因为校验和驻留在已检查的数据内。 是否有一种算法可以用来生成解决这个难题的校验和?
我尝试使用原始值计算校验和。 16 和计算器提供了新的校验和,但一旦将校验和更改为新值,它就不再有效。 我尝试将校验和清零,但发生了同样的事情。 我尝试连续计算它很多次,看看它是否会找到一个能够正确检查自身的值,但也没有什么乐趣。 你最终会追着尾巴,一旦更新新值就无效了。 我认为必须有一个公式或一些翻转技巧,但我无法理解它。 这是一个太模糊的概念,无法从谷歌获得任何有用的信息。 有人可以启发我吗?
简短回答:不,除了
SUM(data) = 0
的情况。
像这样的递归校验和仅在数据总和恰好等于零时才有效 - 否则您最终只会在最后更改结果。一个例子“证明”(数学上不严格)是
SUM(data) + Checksum = Checksum
SUM(data) + Checksum - Checksum = Checksum - Checksum
SUM(data) = 0
如果允许您更改生成(和解释)校验和的方式,您可以将校验和设为数据总和的补码,其中
SUM(data) + Checksum = 0
;如果总 ROM 总和为零,则假设成功。