天天看點

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