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 |
无论循环是否为"反向",
现在你可以忘记这一点,使用其他人提出的答案。
一行程序-(不太可读)-但适用于小写和句柄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在他的答案中做的一样,也不是使用如果你有字典!(您也可以检查
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循环生成的索引?
无论扫描输入字符串的方向(向前或向后),索引都会为最左边的数字生成
尝试使用
进行校正后,扫描方向(向前或向后)无关紧要。您可以将for循环重写为
另外,您知道不需要导入
太多的elif,pow…只需移动
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中不能像您预期的那样工作。