什么是Intel HEX文件格式?
》》一般:英特尔HEX文件格式
简单的说:
英特尔HEX文件由任意数量的数据记录组成,这些数据记录以回车符和换行符结束。
例如数据记录如下:10246200464C5549442050524F46494C4500464C33
该记录解码如下:
10是记录中的数据字节数。
2462是数据在存储器中的地址。
00是记录类型00(数据记录)。
464C … 464C是数据。
33是记录的校验和。
校验和如何计算?
校验和的计算方法是将记录中所有十六进制数字对的值相加模256(0x100)并取补码。
例如:
10246200464C5549442050524F46494C4500464C的校验码计算为:
0x100-(0x10+0x24+0x62+0x00+0x4c+…+0x46+0x4c)mod(0x100)
mod运算即取余运算(%),例如:
150mod100=50;
3mod5=3;
5mod3=2;
看,对吧,其实很简单!
我就直接附上python代码极其代码说明吧
def check(DD):
length=len(DD) #求长度
#创建一个list,将传入的str的每两个数合在一起,再求和
list1=[]
if(length%2==1): #如果str长度为单数,则抛出错误
print('[!] 数据长度有误')
else:
for i in range(0, length, 2): #range(开始,结束-1,每次加多少) 这里即0——length-1 每次循环i+2
hex_digit=DD[i:i + 2] #将传入的str的每两个数合在一起
list1.append('0x'+hex_digit) #再每个字符前+0x 但是它仍然是字符,但更便于下面通过int(list1[i], 16)转换成16进制
print(list1)
sum=0
for i in range(int(length/2)): #求和
sum=int(list1[i], 16)+sum #int(list1[i], 16)将16进制转换成10进制 int类型
sum=sum%256
sum=256-sum
print('校验码: '+hex(sum)) #将sum和结果转换成16进制 hex(sum)
if __name__=="__main__":
DD=input("请输入HEX文件数据记录(校验值除外):") #input接收参数为str类型
check(DD)
再附上一个运行结果:
请输入HEX文件数据记录(校验值除外):1000B00053F021E30CD09FE501AB4DE208009FE5
['0x10', '0x00', '0xB0', '0x00', '0x53', '0xF0', '0x21', '0xE3', '0x0C', '0xD0', '0x9F', '0xE5', '0x01', '0xAB', '0x4D', '0xE2', '0x08', '0x00', '0x9F', '0xE5']
校验码: 0x32
当然,完整的Intel HEX文件还有其它的数据格式,这里就只简单说明这一种啦。其它详情仍可参考最上面的链接。