python 计算Intel HEX文件 HEX记录校验和

本文介绍了Intel HEX文件格式,特别是数据记录的校验和计算方法。通过将记录中所有十六进制数字对的值相加模256并取补码来计算校验和。提供了Python代码实现,并展示了运行结果。
摘要由CSDN通过智能技术生成

什么是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文件还有其它的数据格式,这里就只简单说明这一种啦。其它详情仍可参考最上面的链接。

将S19格式的文件转换为Hex文件,通常是指将包含汇编代码的Motorola S记录(S19或S-record)格式转换为二进制的Hex文件格式。以下是一个简单的Python脚本,用于实现这一转换过程: ```python def s19_to_hex(s19_file_path, hex_file_path): # 打开S19格式文件进行读取 with open(s19_file_path, 'r') as s19_file: # 打开一个新文件用于写入Hex格式数据 with open(hex_file_path, 'wb') as hex_file: # 逐行读取S19文件内容 for line in s19_file: # 去除行尾的换行符并进行检查 stripped_line = line.rstrip('\n') if stripped_line[0] != 'S': continue # 忽略非记录行 # S记录行的格式为 'S<type><address><data><checksum>\n' # 需要提取其中的地址和数据部分 if len(stripped_line) < 11: continue # 跳过不符合长度要求的记录 # S记录类型(例如:S0, S1, S2...) record_type = stripped_line[1] # 地址部分的长度,例如:S1记录有2字节地址 address_length = (ord(stripped_line[2]) - 51) * 2 # 数据部分的起始位置 data_start = 10 # 提取地址部分 address = int(stripped_line[2:2 + address_length], 16) # 提取数据部分 data = stripped_line[data_start:-2].replace(' ', '') # 将数据部分转换为字节数据 bytes_data = bytes.fromhex(data) # 写入地址和数据到Hex文件 hex_file.write(bytes([address >> 8, address & 0xFF])) hex_file.write(bytes_data) # 使用示例 s19_file_path = 'input.s19' # S19格式文件路径 hex_file_path = 'output.hex' # Hex格式文件路径 s19_to_hex(s19_file_path, hex_file_path) ``` 请确保将`input.s19`替换为你实际的S19文件路径,并将`output.hex`替换为你希望生成的Hex文件路径。 注意:上述脚本对于S19文件格式的解析是非常基础的,它假设输入的S19文件格式是正确的,并且没有进行错误处理或异常处理。在实际应用中,你可能需要增加更严格的格式校验和错误处理逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值