如何使用HEX处理数组中的索引

时间:2013-12-03 04:35:28

标签: python arrays hex

我有一个文件,我从中读取行并操纵字符串。

以下是一些行的示例(如果您感兴趣,文件为Intel's HEX format):

:10DE50003EDE179280DB0338D2C32202023CD2D3CB
:10DE600022021792A0DB0338E2C32202023CE2D373
:10DE7000220292533EDEB0906400C4FF022082432F
:10DE80003EDE3741324190C3B8240013FDDBFF056D
:10DE900057494D453420D0D88CDEFDDB8FDEFF03A3

伙伴建议我创建一个数组,其中前4:7字节作为索引EG,DE50,然后使用剩余的16个字节作为数据(不使用DE50后的00,不使用最后一个字节)。他说我可以使用HEX,然后在DE50中添加10来获取DE5A,从而找到与该索引相关的字节。问题是,我无法想办法做到这一点。它甚至可能吗?这样我就可以通过了解真正强大的HEX索引来解决我想要的任何字节。

谢谢!

2 个答案:

答案 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]

然而,这似乎只是为您的数据结构增加了额外的复杂性而没有任何好处。如果你有顺序线,只需按顺序对待它们。如果您将数字作为十六进制字符串,只需将它们转换为数字即可将它们视为索引。