很抱歉标题混乱,但我不知道该怎么称呼......
所以在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)
答案 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
,而不是0xF4
。 0xF4
是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'