0

抱歉标题混淆了,但我不知道该怎么称呼它...

因此,在 python 中,我正在通过插件(intelhex)读取二进制文件。

这让我通过它获得每个字节循环的值

for x in range(start_addr,end_addr):
    print ih[x]

给出:

1
79
60
246

这与以下内容相同:

01
4F
3C
F6

我想要十进制值014F3CF6 = 21970166

将小数转换为十六进制然后连接十六进制值并再次转换为十进制的最佳方法是什么?最好是最容易理解的(pythonic)和/或最有效的

编辑:澄清我想要什么:

我想将 [1,79,60,246] 转换为 21970166

(因为列表与[01,4F,3C,F6] which is 014F3CF6 which is 21970166)

4

4 回答 4

3

在 python 中,整数不是“十进制”或“十六进制”。它们是数字的字符串表示形式。要将十进制字符串转换为 int,请使用int('12345', 10); 要转换十六进制字符串,请使用int('1234ABC', 16). 要将整数转换为十进制字符串表示,请使用str(12345), 转换为十六进制字符串,请使用hex(12345).

此外,您应该看到该模块struct并考虑使用它将二进制数据转换为整数。

于 2012-06-25T11:36:41.097 回答
3

看着intelhex,我想你正在做类似的事情

import intelhex
ih = intelhex.IntelHex('myfile.hex')

而不是一次读取一个字节,例如

>>> ih[0x01c200]
224
>>> ih[0x01c201]
165
>>> ih[0x01c202]
230
>>> ih[0x01c203]
246

你可以做

s = ih.gets(0x01c200, 4)      # "\xe0\xa5\xe6\xf6"

然后转换为 int like

import struct
i = struct.unpack('>I', s)   # (3768968950L,)

然后可以将其打包为

def getInt(ih, addr):
    return struct.unpack('>I', ih.gets(addr, 4))[0]

getInt(ih, 0x01c200)    # -> 3768968950

编辑:

请注意,它ih[undefined_addr]返回 255,而ih.gets(undefined_addr, 1)引发 NotEnoughDataError。事实上,ih.gets(addr, n)如果 [addr:addr+n] 中的任何字节未定义,则抛出 NotEnoughDataError。

如果您执行 ih.dump('dumpfile.txt'),任何未在 .hex 文件中定义的字节都显示为 '--';这可能会使调试变得更加容易。我建议你做一个文件转储,在文本编辑器中提取它,然后查看字节 0x20、0x21、0x22、0x23。

于 2012-06-25T12:35:13.940 回答
1

我会做类似的事情

s = 0
for i in bytes:
    s = s * 256 + i
print s

此外,79 是0x4F,不是0xF40xF4是 244。

于 2012-06-25T11:35:43.713 回答
1

您可以使用int

>>> int('014F3CEC', 16)
21970156

这意味着您应该将字符串连接到一个包含十六进制数字的字符串。你可以这样做:

>>> ih = [1, 79, 60, 236]
>>> ih_s = [hex(i)[2:].zfill(2) for i in ih]
>>> ih_s
['01', '4f', '3c', 'ec']
>>> hex_string = ''.join(ih_s)
>>> hex_string
'014f3cec'
于 2012-06-25T11:38:53.890 回答