玩转S19文件

news/2025/3/16 22:45:04/

本文首发于微信公众号“嵌入式软件实战派”。

这是《玩转Hex文件》的姊妹篇。
如果你还不了解S19或者SREC文件格式,请戳《SREC、Hex、Bin等烧录文件格式完全解读》。

本文与其说是《玩转S19文件》,还不如说是《玩转S19、Hex、Bin文件》,因为接下来讲的神器是可以玩转S19、Hex、Bin的。下面是基于Python的BinCopy库来讲解的。

写数据

方法有很多:

add(data, overwrite=False)
add_binary(data, address=0, overwrite=False)
add_binary_file(filename, address=0, overwrite=False)
add_file(filename, overwrite=False)
add_ihex(records, overwrite=False)
add_ihex_file(filename, overwrite=False)
add_srec(records, overwrite=False)
add_srec_file(filename, overwrite=False)
add_ti_txt(lines, overwrite=False)
add_ti_txt_file(filename, overwrite=False)

使用也很简单,可以自行查找其使用手册来看看,以下挑几个来讲解下。

import bincopy
bf=bincopy.BinFile()
bf.add_binary("embedded_sw".encode(),0x00)

那么得到的内容是

00000000  65 6d 62 65 64 64 65 64  5f 73 77                 |embedded_sw     |

假设,我有另一个bin文件is_great.bin,我想加载到这个bf里面来,可以这样:

bf.add_binary_file("is_great.bin",0x10)

可得到像这样的结果:

00000000  65 6d 62 65 64 64 65 64  5f 73 77                 |embedded_sw     |
00000010  69 73 20 67 72 65 61 74  21                       |is great!       |

同样的道理,
对于intel hex内容可以用方法add_ihex(records, overwrite=False)
对于intel hex文件内容可以用方法add_ihex_file(filename, overwrite=False)
对于SREC(S19)内容可以用方法add_srec(records, overwrite=False)
对于SREC(S19)文件可以用方法add_srec_file(filename, overwrite=False)
……

读数据

读的方法有很多:

as_array(minimum_address=None, padding=None, separator=’, ')
as_binary()
as_ihex(number_of_data_bytes=32, address_length_bits=32)
as_srec(number_of_data_bytes=32, address_length_bits=32)
as_ti_txt()

就针对上面的例子,我试下这些方法

bf.as_array()
0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x69, 0x73, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x21

把padding参数加上

bf.as_array(padding=b'x\ff')
0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x77, 0x78, 0x0c, 0x66, 0x78, 0x0c, 0x66, 0x78, 0x0c, 0x66, 0x78, 0x0c, 0x66, 0x78, 0x0c, 0x66, 0x69, 0x73, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x21

从上面这个padding参数得出的结果可以看出,如果不用padding(即padding=None)的话,得出的结果是不管空白地方的,这个要注意。

bf.as_ihex()
:0B000000656D6265646465645F737782
:09001000697320677265617421B7
:00000001FF
bf.as_srec()
S31000000000656D6265646465645F73777C
S30E00000010697320677265617421B1
S5030002FA
bf.as_ti_txt()
@0000
65 6D 62 65 64 64 65 64 5F 73 77
@0010
69 73 20 67 72 65 61 74 21
q

格式转换

从上面的读数据的例子,很容易得到想要的格式内容,那么将这些格式内容保存成文档,不就是相当于格式转换了吗!

下面以ihex格式为例,其他格式类同:

with open("embedded_sw_ihex.hex", 'w') as f:for l in s19.as_ihex():f.write(l)

但这里要注意,写入的文档最后面会多一个空行,看看这个空行是否会影响你项目上用到的解析软件。当然,你可以用rstrip()删掉最后面的空行(换行符),像这样:

with open("embedded_sw_ihex.hex", 'w') as f:for l in s19.as_ihex().rstrip():f.write(l)

文件裁剪

对于一个文件,我只想其中的一部分,怎么办?可以试试以下两个方法:

crop(minimum_address, maximum_address)
exclude(minimum_address, maximum_address)

解释一下,这个crop就是保留minimum_address ~ maximum_address之间的内容;而exclude就是保留minimum_address ~ maximum_address之间的内容砍掉不要。

下面来实验下这个

bf.crop(0x00, 0x09)
bf.as_hexdump()
00000000  65 6d 62 65 64 64 65 64  5f                       |embedded_       |

数一下这个内容字节数,只有9个字节,其实是不包含最大地址maximum_address的内容的,那么这个maximum_address是什么意思呢?

我们看看官方文档的说明:

crop(minimum_address, maximum_address)
Keep given range and discard the rest.
minimum_address is the first word address to keep (including).
maximum_address is the last word address to keep (excluding).

maximum_address的内容是excluding的。也就是说crop后保留的内容是minimum_addressmaximum_address-1的内容,即[minimum_address, maximun_address)或者[minimum_address, maximun_address-1]。这个跟IntelHex库的.maxaddr()是不一样的。

同样地,接着上面的例子:

bf.exclude(0x03, 0x07)
bf.as_hexdump()
00000000  65 6d 62             64  5f                       |emb    d_       |

其他

查看文件信息,可以用info()方法

bf.info()
Data ranges:0x00000000 - 0x00000003 (3 bytes)0x00000007 - 0x00000009 (2 bytes)

segments可以查看里面的每个数据段内容

for seg in bf.segments: print(seg)
Segment(address=0, data=bytearray(b'emb'))
Segment(address=7, data=bytearray(b'd_'))

所有的segment又可以切割成很小的chunks(size=32, alignment=1)

for chunk in bf.segments.chunks(1): print(chunk)
Chunk(address=0, data=bytearray(b'e'))
Chunk(address=1, data=bytearray(b'm'))
Chunk(address=2, data=bytearray(b'b'))
Chunk(address=7, data=bytearray(b'd'))
Chunk(address=8, data=bytearray(b'_'))

在这里插入图片描述

文章来源:https://blog.csdn.net/lianyunyouyou/article/details/110248776
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/news/178723.html

相关文章

王者荣耀s19赛季服务器维修,王者荣耀S19赛季版本更新bug怎么解决-S19赛季版本更新bug解决方法介绍...

王者荣耀S19赛季版本更新bug怎么解决,有不少玩家都有这样的疑问,今天小编就为大家带来王者荣耀S19赛季版本更新bug解决方法介绍,希望可以帮到有需要的玩家。 王者荣耀S19赛季版本更新bug解决方法介绍 问题一:部分召唤师反馈商店新…

S19文件格式详解(总结)以及与hex文件的互转

S19文件格式详解 ​​ ​​ S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming 格式定义及含义 S-record每行最大是78个字节,…

C#实现s19文件解析

如下是s19实现解析简易代码,具体如下: 外部调用接口:ParseS19 输入参数: 1、path:文件绝对路径 输出参数: 1、startAddr:文件烧入芯片起始地址 2、BinData:文件二进制流List&a…

KILE生成S19或者BIN文件

Keil生成S19文件或者Bin文件需要.axf文件,首先我们需要直到.axf文件的位置 keil或者IAR提供了一个格式转换的小工具:fromif fromelf.exe文件的位置在安装目录 Keil_v5\ARM\ARMCC\bin 或者 Keil_v5\ARM\ARMCLANG\bin 目录下。 具体设置方法如下&#x…

飞思卡尔 s19 转 bin

1. S19文件格式详解 S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming。【注意:编者】: 上面“是一段直接烧写进M…

S19格式

S19格式介绍: 为了在不同的计算机平台之间传输程序代码和数据,摩托罗拉将程序和数据文件以一种可打印的格式(ASCII格式)编码成s格式文件。S-record格式文件是FreescaleCodeWarrior编译器生成的后缀名为.S19的程序文件,S格式文件是Freescale推…

【C++】位图应用 | 布隆过滤器

文章目录 1. 位图应用题目一代码实现setrsettest具体代码 题目二位图优缺点总结 2. 布隆过滤器提出背景概念具体实现hash1 hash2 hash3N取值问题settsettset中在与不在那个准确?使用场景及特点具体代码 1. 位图应用 题目一 给40亿个不重复的无符号整数&#xff0c…

c语言解析s19文件,常见image格式(hex/s19)如何校验?且看Checksum-嵌入式系统-与非网...

今天痞子衡继续给大家介绍针对 packet 校验的最简单的校验法 - 即和校验法。 一、和校验法基本原理 1.1 校验依据 和校验法的校验依据就是判断一次传输的 n bytes 组成的 packet 的所有 byte 累加和结果(仅截取低 byte)在传输前后是否一致。 1.2 和校验位 为了实现和校验,通常…