EPROM中16bit校验和含于待校验数据时的计算算法求解
解决EPROM自包含16位校验和的矛盾方案
核心思路是让包含校验和在内的整个EPROM数据的16位求和结果固定为0,通过补码计算实现自洽的校验和,彻底解决修改校验和导致数据变化的矛盾。
具体算法步骤
假设EPROM共有N个16位存储单元,前N-1个为有效数据,第N个为校验和:
- 计算有效数据的16位和:将前
N-1个单元的无符号16位数值求和,得到S(求和时仅保留低16位,溢出部分直接忽略)。 - 计算校验和:校验和
C = 0x10000 - S(等价于16位补码(-S) mod 65536)。 - 写入校验和:将
C写入第N个单元。
此时,整个EPROM的16位求和结果为S + C = S + (0x10000 - S) = 0x10000,由于16位计算会自动溢出截断低16位,最终结果为0——这就是我们的校验判定标准。
校验流程
将EPROM所有N个单元的16位数值求和,若结果为0则数据完整;否则判定为数据损坏。
为什么你的之前尝试失败?
- 保留原校验和计算新和:这种方式没有固定的校验目标值,更新校验和后总和会变成随机值,无法满足校验条件。
- 置零校验和后计算并写入原和:此时总和为
S + S = 2S,显然不等于0,自然无法通过校验。 - 重复计算循环:没有明确的数学目标,盲目迭代只会陷入死循环,而补码校验是基于数学推导的确定性方案。
示例
假设前N-1个单元的和为0x1234,则校验和为0x10000 - 0x1234 = 0xEDCC。将0xEDCC写入校验位后,整个EPROM的16位和为0x1234 + 0xEDCC = 0x10000,截断低16位后结果为0,符合校验要求。
内容的提问来源于stack exchange,提问作者Christopher Duckworth
相关产品推荐
相关产品推荐

