如何在 Python 中解析十六进制或十进制整数 [重复]

Posted

技术标签:

【中文标题】如何在 Python 中解析十六进制或十进制整数 [重复]【英文标题】:how to parse hex or decimal int in Python [duplicate] 【发布时间】:2010-10-10 21:27:12 【问题描述】:

我有一个字符串,它可以是前缀为“0x”的十六进制数字,也可以是没有特殊前缀的十进制数字,可能是减号。 “0x123”以 16 为基数,“-298”以 10 为基数。

如何在 Python 中将其转换为 int 或 long?

我不想使用 eval(),因为它不安全且过大。

【问题讨论】:

为什么 eval 不安全?邪恶的人会在这些数字中偷偷输入代码吗?谁有权访问这些字符串?他们不值得信任吗? eval 是不安全的,因为它允许执行任意代码。如果您从受信任的来源获取字符串,它仍然是不安全的,只是碰巧您依赖这个受信任的来源而没有利用它。如果你总是在控制字符串,为什么它是一个字符串? 不,python 代码不安全,这个确切的注释适用于导入任意模块等。假设 python 代码始终由您编写,并且您信任您。如果您正在评估您编写的字符串,为什么它是一个 eval 呢?因此,我在回复中的最后陈述。 S.Lott 和 Devin Jeapierre 之间的对话是我认为 SO 上的信誉系统存在的问题。 @AaronHall 我认为重复的目标不正确。尽管那里的最佳答案碰巧提到了int(..., 0) 解决方案,但这不是OP 所要求的(例如字符串"10" 这应该返回10,另一个问题应该返回16)——事实上我会说int(x,0) 方法对于另一个问题是错误的(出于上述原因) 【参考方案1】:
int("0x123", 0)

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

【讨论】:

这只是在 Python 中实现 int 的方式 - 它假定为十进制,除非你明确告诉它通过传递 0 作为基数来猜测。 好,所以前导零不会默认为八进制。 int("010") 返回10 但是 Python 不表示带有前导零的八进制数,它们应该以 0o 作为前缀(例如 0o10)。尽管如此,最常见的用例是从十进制数转换,这是默认行为。 以 16 作为基数会更好。【参考方案2】:

以 16 到 10 为基数(返回一个整数):

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

Base 10 到 16(返回一个字符串):

>>> hex(291)
'0x123'

【讨论】:

【参考方案3】:

您可能正在寻找类似的东西。

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)

【讨论】:

为什么不使用if aString.upper().startswith('0X'): 这样你就不需要or了?当然lower()'0x' 也可以。 @a2j:没有什么好理由。但是,您可以做的是使用timeit 来确定权衡是什么。【参考方案4】:

如果您要在不同的数字系统之间进行大量转换,那么位串库可以让很多二进制/十六进制操作变得更容易。它还支持字符串解释:

http://pythonhosted.org/bitstring/

【讨论】:

【参考方案5】:

这是一个更简单的版本,就像一个魅力。 返回字符串,因为 hex() 返回相同的类型:

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

【讨论】:

OP 想要将字符串转换为 int。你的代码是相反的。 当你使用 python 关键字作为参数的名称时,至少可以说是很奇怪

以上是关于如何在 Python 中解析十六进制或十进制整数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C将十六进制字符串解析为整数

获取Python中整数所需的字节大小

用 GMP 解析十进制值?

如何在颤动中将十六进制颜色代码解析为它们各自的整数值

Python入门-2编程基本概念:08整数-不同进制-其他类型转换成整数

如何将十六进制颜色字符串解析为整数