一、s19文件

Motorola S-record是由Motorola创建的一种文件格式,它以 ASCII十六进制文本形式传送二进制信息。这种文件格式也可以称为SRECORD、SREC、S19、S28、S37。

python 解析android res python 解析S19文件_16进制

S-record 格式文件由一系列 ASCII 文本记录组成。这些记录从左到右具有以下结构:

type

count

address

data

checksum

S19文件行格式
type(记录类型):2个字符,一个大写的"S"(0x53),然后是一个数字0~9,定义了记录的类型 (S0,S1,S2,S3,S5,S7,S8,S9)。 

count(字节计数):2个字符,16进制数字,表示记录的其余部分(address + data + checksum)的字节数(16进制数字对)。

address(地址):4或6或8个字符。由记录类型 type 决定。对于S1和S9类型(S19),地址字段为 4 个十六进制数字(2 个字节)。对于S2和S8 record(S28),地址字段为 6 个十六进制数字(3个字节),对于S3和S7 record(S37),地址字段为 8 个十六进制数字(4 个字节)。地址首先以 MSB 发送。地址字节以大端格式排列。

data(数据):0—64字符。用来组成和说明一个代表了内存载入数据或者描述信息的16进制的值。

checksum(校验和):2个字符。这些字符当被配对并换算成16进制数据的时候形成了一个最低有效字符 节,该字符节用来表达作为补充数据,地址和数据库的字符对所代表的(字节的)补码的byte总和。

二、使用python解析s19文件

S3数据记录了包含从 32 位地址开始的数据,以下示例解析S3数据。

1.打开一个s19文件

# 打开一个S19文件
with open(file='test.s19', mode='r') as s19_file:

2.读取一行数据

# 读取一行数据
for s19_line in s19_file.readlines():

3.将读取的行数据去除换行符

# 去除该行的换行符
s19_line_data = s19_line.strip()
print(s19_line_data)

输出结果

python 解析android res python 解析S19文件_python_02

4.获取type类型

# 获取type
s19_type = s19_line_data[0:2]
print(s19_type)

使用切片获取前两个字符 ,输出的结果

python 解析android res python 解析S19文件_16进制_03

5.获取count

s19_count = int(s19_line_data[2:4],16)
print(s19_count)

int()函数将字符串转换为整型 

输出结果

python 解析android res python 解析S19文件_python_04

6.获取address

# 获取address
s19_address = int(s19_line_data[4:12],16)
print(hex(s19_address))

使用切片获取地址address,使用int()函数将字符串转换为整型 

输出的时候使用hex()函数将地址转换为16进制字符串

python 解析android res python 解析S19文件_字符串转换_05

7.获取data

# 获取数据
s19_data = s19_line_data[12:12+(s19_count-5)*2]
# 将字符串转换为hex数组
s19_data_ba = bytearray.fromhex(s19_data)
print(s19_data_ba)

使用切片获取数据,使用bytearray.fromhex()方法将16进制字符串转换为bytearray数组

输出结果

python 解析android res python 解析S19文件_数据_06

 8.S3数据解析示例

python 解析android res python 解析S19文件_16进制_07