python十六进制到十进制使用for循环

时间:2014-01-28 08:09:33

标签: python hex decimal number-systems

import math
def hexToDec(hexi):
    result = 0
    for i in range(len(hexi)-1,-1,-1):
        if hexi[i] == 'A':
            result = result + (10 * math.pow(16,i))
        elif hexi[i] == 'B':
            result = result + (11 * math.pow(16,i))
        elif hexi[i] == 'C':
            result = result + (12 * math.pow(16,i))
        elif hexi[i] == 'D':
            result = result + (13 * math.pow(16,i))
        elif hexi[i] == 'E':
            result = result + (14 * math.pow(16,i))
        elif hexi[i] == 'F':
            result = result + (15 * math.pow(16,i))
        else:
            result = result + (int(hexi[i]) * math.pow(16,i))
    return result

即使在反转范​​围顺序并重新导入后,我仍然得到相同的结果。

7 个答案:

答案 0 :(得分:1)

虽然可以有这样漂亮的答案

x = int("FF0F", 16)

查看原始代码出错的方式也很重要。更正后的版本应为:

import math
def hexToDec(hexi):
    result = 0
    for i in range(len(hexi)):
        cur_pow = len(hexi) - i  - 1
        if hexi[i] == 'A':
            result = result + (10 * math.pow(16,cur_pow))
        elif hexi[i] == 'B':
            result = result + (11 * math.pow(16,cur_pow))
        elif hexi[i] == 'C':
            result = result + (12 * math.pow(16,cur_pow))
        elif hexi[i] == 'D':
            result = result + (13 * math.pow(16,cur_pow))
        elif hexi[i] == 'E':
            result = result + (14 * math.pow(16,cur_pow))
        elif hexi[i] == 'F':
            result = result + (15 * math.pow(16,cur_pow))
        else:
            result = result + (int(hexi[i]) * math.pow(16,cur_pow))
    return result

无论你是否“反向”循环,功率顺序和hexi的索引应该在相反的方向上迭代,一个在另一个方向上逐渐减少。

现在你可以忘记这一点并使用别人建议的答案。

答案 1 :(得分:0)

在python中如果你想重新导入一些东西,你需要重新启动python进程,或者手动复制你在python中更改的文件的内容,或者更方便地使用ipython中的℅cpaste。

重新导入在python中不会像你冒险一样。

答案 2 :(得分:0)

太多 elif pow ...只需 shift (result = result * 16)添加 {{ 1}}类似

(ord(ch) - ord(...))

答案 3 :(得分:0)

您是否观察过for循环生成的索引?

无论您扫描输入字符串(向前还是向后)的方向如何,索引都会为最左边的数字生成0,为最右边的数字生成len(i)-1。因此,当您使用索引来计算math.pow(16,i)中的“数字位置”时,您的计算就好像输入字符串的第一个字符是最右边(最不重要)的数字。

尝试使用math.pow(16, len(hexi)-1-i) ...

进行此校正后,扫描方向(向前或向后)无关紧要。你可以将你的for循环重写为for i in range(len(hexi)):

另外,您知道您不需要导入math模块来计算能力吗?您可以使用**运算符:2**416**i16**(len(hexi)-1-i)

答案 4 :(得分:0)

hexToDec = lambda hexi: int(hexi,16)

或在Python 2中:

hexToDec = lambda hexi: long(hexi,16)

答案 5 :(得分:0)

其他人已经展示了快速的方法,但是因为你想要它在for循环中......你的问题是你的循环参数,功率需要是字符串的len - 当前的地方 - 1就像@ YS-L在答案中也没有使用if-else你有字典! (您也可以检查'A' <= myCurrentChar <= 'F'

import math
def hexToDec(hexi):
    result = 0
    convertDict = {"A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15}
    for i in range(len(hexi)):    
        if str.isdigit(hexi[i]):
            result += int(hexi[i]) * math.pow(16, len(hexi) - i - 1)
        else:
            result += convertDict[hexi[i]] * math.pow(16, len(hexi) - i - 1)

    return int(result)

print hexToDec("FFA")

<强>输出:

4090

答案 6 :(得分:0)

单行 - (不太可读) - 但适用于小写并处理 0x 前缀

sum(16**pwr*(int(ch) if ch.isdigit() else (ord(ch.lower())-ord('a')+10))
    for pwr, ch in enumerate(reversed(hexi.replace('0x',''))))