用Python实现十六进制向十进制转换
0. 引言
最近心血来潮,想通过对比C语言数据结构和Python语言数据结构异同,加深对二者的学习理解。特从最基础的开始复习,首先遇到了指针,以及指针地址的理解。突发奇想,尝试用Python练习下如何将十六进制数转换为十进制数。(作为一只还在纠结指针的菜鸟,此刻内心已经感受到了大牛们关爱制杖的眼神。)
1. C语言中的地址
先看代码:
#include <stdio.h>
int main()
{
int i=26;
printf("i(十进制)=%d.\n",i); #查看i的值(十进制);
printf("&i(十六进制)=%p.\n", &i); #查看i的地址(十六进制);
printf("&i(十进制)=%d.\n",&i); #查看i的地址(十进制);
printf("i(十六进制)=%p.\n",i); #查看i的值(十六进制);
return 0;
}
输出:
i(十进制)=26.
&i(十六进制)=000000000062FE1C.
&i(十进制)=6487580.
i(十六进制)=000000000000001A.
众所周知,就算电脑有毛病,也能得出上述结果。C语言中的十进制和十六进制互换用printf()中的%p和%d可以实现,但是Python语言是面向对象语言,对变量存储地址没有太多要求,有一个id()的函数用于获取对象的内存地址。此时,“做一个十六进制到十进制转换的函数”的念头就像晴空万里突然暴风雨无处躲避,没办法,写一个吧。(也许python中很简单的转换函数,希望各位大牛留言告知。)
2. Python语言实现
先看代码:
import math
def convertDectoHex(a):
al=list(a)
b={'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
multi=0
sumof=0
for i in range(len(a)):
if al[i] in b.keys():#如果al[i]的值在字典b的keys中,则:
multi=int(b[al[i]])
else:
multi=int(al[i])
sumof+=multi*math.pow(16,len(a)-i-1)
return sumof
a=input('16进制:')
print('十六进制的{}化成十进制为{}.'.format(a,convertDectoHex(a)))
Fn+F5运行这段程序:
16进制: 62FE1C
输 出 : 十六进制的62FE1C化成十进制为6487580.0.
这明显没有任何问题,所以,我写这篇文章的重点是什么?
3. Python语言代码需要重点关注的问题
上面那段并不长的代码有两处需要重点关注的点:
重点一:数据类型转换
'str'-->'int'
运行后输入
62FE1C
,得到:
a='62FE1C'
但是,
type(a)
=<class ‘str’>。在自定义函数中
al=list(a)
,将字符串变成列表,但是列表中的元素依然是字符串类型:
type(al[0])=<class 'str'>
。
各位大佬也很清楚,字符串是没法运算的。所以,需要强制数据类型转换:
multi=int(b[al[i]])
,即:1.在字典中取出
key是al[i]
对应的
value
,2.在将其转化为
int
类型。其实,这一步可以不做,因为在创建字典
b
时就已经输入了数值类型值。后面的
multi=int(al[i])
也是类似操作。
重点二:字典
dict()
中‘键’和‘值’的使用
程序中
if al[i] in b.keys():
是判断输入的十六进制数中是否有
‘A’, 'B', 'C', 'D', 'E', 'F'
这些值,如果有则取出字典中他们对应的数值。
4. 结语
下面进行技术总结(咦,似乎在哪里听过?):1.注意字符串转换为数值类型;2.字典很强大,该用就用。