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

python hex to decimal using for loop

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

即使颠倒了范围顺序并重新导入,我仍然得到相同的结果。


虽然会有这样美好的答案

1
x = int("FF0F", 16)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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的幂级和索引都应该以相反的方向迭代,一个递增一个递减。

现在你可以忘记这一点,使用其他人提出的答案。


一行程序-(不太可读)-但适用于小写和句柄0x前缀

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


其他人已经展示了快速的方法,但是因为你想要它在一个for循环中…你的问题是在你的循环参数中,权力需要是字符串的长度-当前的位置-1就像@ys-l在他的答案中做的一样,也不是使用如果你有字典!(您也可以检查'A' <= myCurrentChar <= 'F')

1
2
3
4
5
6
7
8
9
10
11
12
13
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")

输出:

1
4090

1
hexToDec = lambda hexi: int(hexi,16)

或者在Python 2中:

1
hexToDec = lambda hexi: long(hexi,16)


您是否观察了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)


太多的elif,pow…只需移动(result = result * 16)并添加(ord(ch) - ord(...))之类的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
""" Manual hexadecimal (string) to decimal (integer) conversion
    hexadecimal is expected to be in uppercase
"""

def hexToDec(hexi):
  result = 0;

  for ch in hexi:
    if 'A' <= ch <= 'F':
      result = result * 16 + ord(ch) - ord('A') + 10
    else:
      result = result * 16 + ord(ch) - ord('0')

  return result;


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

重新导入在python中不能像您预期的那样工作。