【问题标题】:how to parse hex or decimal int in Python [duplicate]如何在 Python 中解析十六进制或十进制整数 [重复]
【发布时间】: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) 方法对于另一个问题是错误的(出于上述原因)

标签: python


【解决方案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 关键字作为参数的名称时,至少可以说是很奇怪
      猜你喜欢
      • 2022-11-16
      • 2020-09-11
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2010-12-30
      • 2012-03-01
      • 2021-09-29
      • 2013-06-13
      相关资源
      最近更新 更多