天天看点

用Python实现十六进制向十进制转换用Python实现十六进制向十进制转换

用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.字典很强大,该用就用。