2013-08-23 100 views
1

我是python的新手,並且正在通過一個名爲python的開源項目,由Donour Sizemore爲ELM327(不太確定,可能針對更多scantool設備)。我可以看出,以下是一種轉換十六進制值爲int.But它是如何工作的?特別是其中的eval以下代碼片段如何工作?

def hex_to_int(str): 
    i = eval("0x" + str, {}, {}) 
    return i 
+7

這是非常非常糟糕的代碼。不要試圖從中吸取教訓。 –

+0

也許你可以在http://codereview.stackexchange.com上詢問 – 2013-08-23 19:01:58

+1

我其實很勉強。我並不經常在代碼中畏縮。 – roippi

回答

4

eval運行一個字符串就好像它是Python代碼,然後輸出結果。

在這種情況下,它運行類似0xaf這是一種指定十六進制文字的方式,並輸出結果整數。嘗試在Python解釋器中輸入0xaf,您將得到一個整數作爲結果。

eval在不受信任的輸入上使用是不安全的。例如,

eval("0xa and __import__('os').remove('some/file/path')") 

可能會刪除系統中的文件。

這將是更好地使用ast.literal_evalint

>>> import ast 
>>> ast.literal_eval("0xaf") 
175 
>>> int("af", 16) 
175 

哪些是安全的,併產生相同的結果。

+0

噢好吧..這沒有回答爲什麼代碼是否定的...但十六進制值如何轉換爲整數值? –

+1

@JaneLove由於Python將0xaf識別爲有效的Python代碼,並運行它。嘗試在Python解釋器中輸入 - 你會得到一個整數作爲輸出。 – agf