【问题标题】:How to address indicies in an array using HEX如何使用 HEX 寻址数组中的索引
【发布时间】:2013-12-03 04:35:27
【问题描述】:

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

以下是其中几行的示例(如果您有兴趣,该文件是Intel's HEX format):

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

有小伙伴建议我创建一个数组,以前4:7字节为索引,EG,DE50,然后用剩下的16个字节作为数据(DE50后面的00不用,最后一个字节不用)。他说我可以使用 HEX 并将比如说 10 添加到 DE50 以获取 DE5A,从而找到与该索引关联的字节。问题是,我想不出办法做到这一点。甚至可能吗?这将允许我通过知道非常强大的 HEX 索引来处理我想要的任何字节。

谢谢!

【问题讨论】:

  • 字符 4:7 是 E50,而不是 DE50。您可能指的是字符 3:7?此外,字符 3:7 代表字节 1:3,而不是字节 3:7(因为每个 pair 十六进制字符代表一个字节,当然每个字符的开头都有一个冒号)。最后,剩下 36 个字符或 18 个字节,而不是 16 个。
  • 同时,你确定你应该跳过最初的10吗?还是下面的00?我不知道“英特尔的 HEX 格式”是什么意思,但总的来说,32 位索引/地址/等。更常见的不是 16 位数字,前面有 8 位填充符,后面有 8 位填充符。
  • @abarnert,1000 具有特殊含义。我将它链接到维基百科页面。
  • OK,最后一个字节有特殊含义(校验和)。

标签: python arrays hex


【解决方案1】:

有一个Intel Hex package in pypi,也许你应该先看看它

以下是从文档中复制的一些示例。

一旦创建,IntelHex 对象就可以加载数据。这只是 如果在构造函数中未指定“source”,则需要。你也可以 多次加载数据(但如果这些文件中的地址与您重叠 获取异常地址重叠错误)。此错误仅在以下情况下引发 从十六进制文件中读取。从其他格式读取时,没有 显式调用合并,数据将被覆盖。例如:

>>> 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.fromfile。

以上所有示例都将从 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

【讨论】:

    【解决方案2】:

    您在这里是正确的,但您不能有一个由十六进制字符索引的“数组”。数组和列表总是由整数索引,从 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]
    

    但是,这似乎只是为您的数据结构增加了额外的复杂性,而没有任何好处。如果您有连续的行,请按顺序处理它们。如果您将数字作为十六进制字符串,只需将它们转换为数字以将它们视为索引。

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 2018-05-31
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多