如何在 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 中解析十六进制或十进制整数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章