【问题标题】:decimal positions to decimal via hex? (python)小数位通过十六进制转换为十进制? (Python)
【发布时间】:2012-06-25 11:32:58
【问题描述】:

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

所以在 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)相同

【问题讨论】:

  • 也意识到了这一点,我希望现在修复

标签: decimal python hex


【解决方案1】:

看着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。

【讨论】:

  • 非常感谢!这是我真正想要的,但我自己没有找到!
  • 也利用了这个,试试:mystring = ih.gets(0x20,4) except intelhex.NotEnoughDataError: print "There is not enough data at that location"
  • 如果你做ih.dump(),它会在内存位置0x20显示什么?您确定要查找 4 字节 int,而不是 2 字节 shortint?
  • 我确定我得到的价值,因为脚本正在将它与 Excel 表进行比较以发现差异和相似之处。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我会做类似的事情

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

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

    【讨论】:

      【解决方案4】:

      你可以使用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'
      

      【讨论】:

      • 很好,不过花了一些时间来理解 hex(i)[2:].zfill(2)
      • zfill 的替代方法是使用字符串格式:'{0:02x}'.format(i)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2011-08-13
      • 1970-01-01
      • 2017-03-08
      • 2018-09-04
      • 2015-01-26
      • 1970-01-01
      相关资源
      最近更新 更多