如何解析Python中的十六进制或十进制整数

问题描述:

我有一个字符串,可以是以“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

int("0x123", 0) 

(为什么不int("0x123")做呢?)

像这样的东西可能是你在找什么。

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) 

基16至10(返回一个整数):

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

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

>>> hex(291) 
'0x123' 

这是一个简单的版本,其工作方式类似于一个魅力。 返回字符串自十六进制()返回相同的类型:

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

如果你做了很多不同的数字系统之间的走,该位串库做了很多的二进制/六角操作更容易。它也支持字符串解释:

http://pythonhosted.org/bitstring/