我有一个文件,我从中读取行并操纵字符串。
以下是一些行的示例(如果您感兴趣,文件为Intel's HEX format):
:10DE50003EDE179280DB0338D2C32202023CD2D3CB
:10DE600022021792A0DB0338E2C32202023CE2D373
:10DE7000220292533EDEB0906400C4FF022082432F
:10DE80003EDE3741324190C3B8240013FDDBFF056D
:10DE900057494D453420D0D88CDEFDDB8FDEFF03A3
伙伴建议我创建一个数组,其中前4:7字节作为索引EG,DE50,然后使用剩余的16个字节作为数据(不使用DE50后的00,不使用最后一个字节)。他说我可以使用HEX,然后在DE50中添加10来获取DE5A,从而找到与该索引相关的字节。问题是,我无法想办法做到这一点。它甚至可能吗?这样我就可以通过了解真正强大的HEX索引来解决我想要的任何字节。
谢谢!
答案 0 :(得分:2)
有一个Intel Hex package in pypi或许你应该先看看
以下是从文档中复制的一些示例。
创建后,可以使用数据加载IntelHex对象。这只是 如果构造函数中未指定“source”,则必需。你也可以 多次加载数据(但如果这些文件中的地址与您重叠 获取异常AddressOverlapError)。只有在出现时才会出现此错误 从十六进制文件读取。从其他格式阅读时,没有 显式调用merge,数据将被覆盖。 E.g:
>>> from intelhex import IntelHex
>>> ih = IntelHex() # create empty object
>>> ih.loadhex('foo.hex') # load from hex
>>> ih.loadfile('bar.hex',format='hex') # also load from hex
>>> ih.fromfile('bar.hex',format='hex') # also load from hex
注意:建议使用IntelHex.from文件。
以上所有示例都将从HEX文件中读取。 IntelHex也 支持读取直接二进制文件。例如:
>>> from intelhex import IntelHex
>>> ih = IntelHex() # create empty object
>>> ih.loadbin('foo.bin') # load from bin
>>> ih.fromfile('bar.bin',format='bin') # also load from bin
>>> ih.loadbin('baz.bin',offset=0x1000) # load binary data and place them
>>> # starting with specified offset
最后,可以从适当的Python字典加载数据。 这将允许您将IntelHex对象中的数据存储到 内置字典并在以后恢复该对象。对于 例如:
>>> from intelhex import IntelHex
>>> ih = IntelHex('foo.hex') # create empty object
>>> pydict = ih.todict() # dump contents to pydict
...do something with the dictionary...
>>> newIH = IntelHex(pydict) # recreate object with dict
>>> another = IntelHex() # make a blank instance
>>> another.fromdict(pydict) # now another is the same as newIH
答案 1 :(得分:1)
你在这里是正确的轨道,但你不能有一个由十六进制字符索引的“数组”。数组和列表始终用整数编制索引,从0开始。
如果您知道初始偏移量(您从第一行开始),则可以非常轻松地创建索引。例如,从'DE50'
到'DE5F'
的所有内容都应该是#0行,对吧?因此,将DE50
转换为整数,除以16(截断分数),然后减去0xDE50。像这样:
with open('hexfile.txt') as f:
lines = list(f)
offset = int(lines[0][4:7], 16) // 16
def get_line(hex_index):
index = int(hex_index, 16) // 16
return lines[index - offset]
或者,你可以使用dict
键入十六进制索引,而不是list
,然后执行你朋友建议的操作:
with open('hexfile.txt') as f:
lines = {line[4:7]: line for line in f}
def get_line(hex_index):
base_hex_index = hex_index[:3] + '0'
return lines[base_hex_index]
然而,这似乎只是为您的数据结构增加了额外的复杂性而没有任何好处。如果你有顺序线,只需按顺序对待它们。如果您将数字作为十六进制字符串,只需将它们转换为数字即可将它们视为索引。