Intel HEX 文件里每条以 : 开头的记录,最后 1 个字节,也就是最后两个十六进制字符,是该行记录的 checksum。
格式是:
:LLAAAATTDATA...CC
含义:
LL:数据长度,例如 20 表示 0x20 = 32 字节数据
AAAA:低 16 位地址
TT:记录类型,00 是数据记录,01 是文件结束,04 是扩展线性地址
DATA:数据内容
CC:本行 checksum
checksum 不是整文件校验,而是每一行单独校验。计算规则是:
LL + AA高字节 + AA低字节 + TT + 所有DATA字节 + CC 的低8位 = 0
所以你图里的:
修改前 ...D5CAFE90C,最后 0C 是旧校验
修改后 ...F493A6F2D9,最后 D9 是新校验
第二行修改后最后 F1 是新校验
:00000001FF 里的 FF 是 EOF 结束记录的校验
最后一行单独的 1A 不是 HEX 记录,是 DOS EOF 控制字符,不参与 Intel HEX 校验。
20EF00000000000C0001A0100000002412200001C90E630C0BB5F9B5A108A2E6F493A6F2D9?你这个D9是怎么算出来的,过程说一下
D9 是这一条 Intel HEX 记录的"本行校验字节",不是数据本身。
你这行实际按 Intel HEX 解析为:
:20 EF00 00 0000000C0001A0100000002412200001C90E630C0BB5F9B5A108A2E6F493A6F2 D9
拆开是:
20 数据长度 = 0x20 = 32 字节
EF 00 地址 = 0xEF00
00 记录类型 = 数据记录
... 32 字节数据
D9 checksum
计算时把 D9 之前的所有字节相加:
20 + EF + 00 + 00
- 00 + 00 + 00 + 0C + 00 + 01 + A0 + 10
- 00 + 00 + 00 + 24 + 12 + 20 + 00 + 01
- C9 + 0E + 63 + 0C + 0B + B5 + F9 + B5
- A1 + 08 + A2 + E6 + F4 + 93 + A6 + F2
= 0x0B27
只看低 8 位:
0x0B27 & 0xFF = 0x27
Intel HEX 要求:
所有字节相加,包括 checksum,低 8 位必须等于 0
所以 checksum 要让:
0x27 + checksum = 0x100
因此:
checksum = 0x100 - 0x27 = 0xD9
验证:
0x0B27 + 0xD9 = 0x0C00
低 8 位 = 0x00
所以这一行最后的校验值就是 D9。