2009-03-02 92 views
31

我有一個字符串,可以是以「0x」爲前綴的十六進制數字,也可以是除了可能爲負號外沒有特殊前綴的十進制數字。 「0x123」以16爲底,「-298」以10爲底。如何解析Python中的十六進制或十進制整數

如何在Python中將其轉換爲int或long?

我不想使用eval(),因爲它是不安全和過度殺傷的。

+0

爲什麼eval不安全?邪惡的人會將代碼隱藏到這些數字中嗎?誰有權訪問這些字符串?他們不值得信賴嗎? – 2009-03-02 22:12:58

+9

eval是不安全的,因爲它允許執行任意代碼。如果您從可信來源獲取字符串,它仍然是不安全的,只是發生在您依賴此可信來源而不能利用此信息的情況下。如果你總是控制着弦,爲什麼它是弦? – 2009-03-02 22:17:35

+0

您的python程序以源代碼形式提供 - 也是「任意代碼」。爲什麼要在一組Python源代碼和另一個Python源代碼之間劃一條線? Eval不會比首先運行Python程序安全。 – 2009-03-02 22:20:12

回答

52
int("0x123", 0) 

(爲什麼不int("0x123")做呢?)

5

像這樣的東西可能是你在找什麼。

def convert(aString): 
    if aString.startswith("0x") or aString.startswith("0X"): 
     return int(aString,16) 
    elif aString.startswith("0"): 
     return int(aString,8) 
    else: 
     return int(aString) 
25

基16至10(返回一個整數):

>>> int('0x123', 16) 
291 

基10至16(返回字符串):

>>> hex(291) 
'0x123' 
-2

這是一個簡單的版本,其工作方式類似於一個魅力。 返回字符串自十六進制()返回相同的類型:

def itoh(int): return hex(int)[2:]