how to parse hex or decimal int in Python
我有一个字符串,它可以是一个以"0x"为前缀的十六进制数字,也可以是一个不带特殊前缀的十进制数字,除了可能的减号之外。0x123"在16基,-298"在10基。
如何在Python中将其转换为int或long?
我不想使用eval(),因为它不安全而且杀伤力太强。
- 为什么评估不安全?邪恶的人会把密码潜入这些号码吗?谁有权使用这些字符串?他们不可信吗?
- eval不安全,因为它允许执行任意代码。如果从可信源获取字符串,那么它仍然是不安全的,只是碰巧您依赖于该可信源而没有利用它。如果你总是控制着字符串,为什么它是字符串?
- 您的python程序以源代码形式提供——它也是"任意代码"。为什么要在一组Python源代码和另一组源代码之间划一条线?eval的安全性不亚于首先运行python程序。
- 不,python代码是不安全的,这个确切的注释适用于导入任意模块等。假设Python代码总是由您编写的,并且您信任您。如果你在评估一个你写的字符串,为什么它是一个评估?因此,我在回复中的最后一句话。
- 洛特和杰佩尔之间的对话,我认为是声誉体系的问题。
- @Devinjeanpierre:"如果你一直控制着绳子,为什么它是一根绳子?":允许动态代码生成,如collections.namedtuple实现。尽管在大多数情况下,这种高水平的魔法是不必要的。
- @jfsasebastianeh,甚至是namedtuple都会接受潜在的用户输入,必须进行消毒,否则会打开一个可能的安全漏洞。想要使用exec或eval而完全不可能进行用户输入的情况很少。
- @杜克洛先生,你能详细说明一下在这种情况下,代表系统的问题是什么吗?
- @阿隆霍尔,我认为重复的目标是不正确的。虽然上面的答案正好提到了int(..., 0)解决方案,但这不是OP要求的(例如,对于字符串"10",这应该返回10,另一个问题应该返回16)--事实上,我认为int(x,0)方法对于另一个问题是错误的(基于上述原因)。
(为什么int("0x123")不这么做?)
- 这只是在python中实现int的方式——它采用十进制,除非您通过将0作为基数明确地告诉它进行猜测。
- 很好,所以前导零不会默认为10月。int("010")返回10。
- 但是python不代表带前导零的八进制数,它们应该以0o作为前缀(例如0o10)。不过,最常见的用例是从十进制数字转换,这是默认行为。
以16到10为基数(返回整数):
1 2
| >>> int('0x123', 16)
291 |
以10到16为基数(返回字符串):
像这样的东西可能是你要找的。
1 2 3 4 5 6 7
| 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'):,这样你就不需要或了?当然,lower()和'0x'也起作用。
- @A2J:没什么好理由。但是,您可以使用timeit来确定折衷是什么。
如果您在不同的数字系统之间进行了大量的切换,那么位串库可以使许多二进制/十六进制操作变得更容易。它还支持字符串解释:
http://pythonhosted.org/bitstring/
这是一个简单的版本,工作起来很有魅力。返回字符串,因为hex()返回相同的类型:
1
| def itoh(int): return hex(int)[2:] |
- OP想要把一个字符串转换成一个int。代码则相反。
- 使用python关键字作为参数名时,至少要说