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