通过十六进制的小数位到十进制(蟒蛇)

时间:2012-06-25 11:32:58

标签: decimal python hex

很抱歉标题混乱,但我不知道该怎么称呼......

所以在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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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,如

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。实际上,如果[addr:addr + n]中的任何字节未定义,ih.gets(addr, n)将抛出NotEnoughDataError。

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

答案 2 :(得分:1)

我会做像

这样的事情
s = 0
for i in bytes:
    s = s * 256 + i
print s

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

答案 3 :(得分: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'