在Python中将十六进制字符串转换为整数

972

如何将十六进制字符串转换为整数?

"0xffff"   ⟶   65535
"ffff"     ⟶   65535

2
如果您只需要在代码中以十六进制格式编写整数,请直接编写0xffff,无需引号,因为它已经是一个整数字面量。 (参考链接:https://docs.python.org/3/reference/lexical_analysis.html#integer-literals) - user3064538
10个回答

1426

没有0x前缀,您需要明确指定基数,否则无法确定:

x = int("deadbeef", 16)

使用0x前缀时,Python可以自动区分十六进制和十进制:

>>> print(int("0xdeadbeef", 0))
3735928559
>>> print(int("10", 0))
10

若要调用此前缀猜测行为,您必须将基数指定为0; 如果省略第二个参数,int()会假设使用10进制。


66
这意味着你应该始终将16用作第二个参数。 显式优于隐式。 - Bachsau
29
@bachsau,明显不正确。如果你想读取用户的输入并允许十六进制或十进制的输入,以方便用户使用呢? - Dan Lenski
26
好的,我应该说:在这种特定情况下!原始问题是“如何将十六进制字符串转换为……”。如果您想让用户自己决定,那么这是一个有用的功能,您是正确的。请注意,我的翻译尽量保持了原意,并且简洁易懂,没有额外的解释或信息返回。 - Bachsau
1
@DanLenski,它总是将十六进制字符串转换为正数。我希望int("FFFF",16)被转换为-1。 - Nazar
1
@Nazar,很久没有联系了,所以这对你来说可能已经没有用处了。但是对于其他偶然路过的人来说,如果需要应用二进制补码规则,这个答案可能会有所帮助。https://dev59.com/qHI-5IYBdhLWcg3w8NSB - Jeremy
显示剩余2条评论

221

int(hexstring, 16)可以实现这个功能,并且可以处理带或不带0x前缀的字符串:

>>> int("a", 16)
10
>>> int("0xa", 16)
10

16 是用来做什么的? - Max
2
@Max,16 是指十六进制。通常人们使用十进制(在 Python 中,当你不传递第二个参数给 int() 时,会默认使用 10),其中你从 0 开始计数,然后依次加上 0123456789(总共 10 个数字),直到回到 0 并在下一位上加 1。在十六进制(也称为“十六进制”或“hex”)中,你从 0 开始计数,然后依次加上 0123456789ABCDEF(总共 16 个数字)。int 函数接受任何从 2 到 36 的数字作为基数,它只是扩展了字母表:基数 36 是 0123456789ABCEDFGHIJKLMNOPQRSTUVWXYZ - user3064538

55

将十六进制字符串转换为整数(int)在 Python 中

我可能有一个像 "0xffff" 或者只是 "ffff" 这样的字符串。

要将字符串转换为整数,可以将该字符串传递给 int 函数,并指定转换所需的基数。

以下两个字符串都可以用此方式进行转换:

>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535

int 推断基数

如果你将 0 作为基数传递,int 将从字符串前缀中推断出基数。

>>> int(string_1, 0)
65535

如果没有十六进制前缀0xint就没有足够的信息来猜测:

>>> int(string_2, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'

字面值:

如果你在源代码或解释器中输入文本,Python会为你进行转换:

>>> integer = 0xffff
>>> integer
65535

这不能用于 ffff,因为 Python 将会认为你试图写入一个合法的 Python 名称:

>>> integer = ffff
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined

Python中的数字以数字字符开头,而Python的名称不能以数字字符开头。


值得重复的是,“如果你将0作为基数传递,int将从字符串前缀推断出基数。” 如何像Python解释器一样将十六进制或十进制(或二进制)转换为整数。 - gaoithe

51

对于任何给定的字符串 s:

int(s, 16)

16

补充Dan之前的回答:如果你向int()函数提供一个十六进制字符串,你必须指定基数为16,否则它将不认为你给了它一个有效值。对于不包含在字符串中的十六进制数,指定基数16是不必要的。

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid

14

3
值得注意的是,eval的速度极慢,除了所有其他问题之外。 - j6m8
6
如果这是一个不好的想法,那提出来有什么意义呢? - pppery
4
好的,部分原因是我觉得很有趣,另一部分原因是我在生产代码中看到过它。 - André Laszlo
1
我觉得这很有趣且启发性,很高兴它被发布了。 - Sidharth Ghoshal
2
刚刚收到了一个踩,但我还是会保留这个答案,因为它仍然非常常见:https://github.com/search?l=Python&q=%27eval%28%220x%22%27&type=Code - André Laszlo
显示剩余5条评论

7
或者使用ast.literal_eval(与eval不同,这是安全的):
ast.literal_eval("0xffff")

演示:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 

2
这个可以工作,但比 int(..., base=16) 慢得多。 - Niklas Mertsch

4

如果您正在使用Python解释器,只需输入0x(您的十六进制值),解释器将自动为您转换。

>>> 0xffff

65535

1
在我的情况下,格式化选项“%x”似乎也适用于赋值语句。(假设使用Python 3.0及更高版本)。 示例
a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100

注释是不正确的。print(b)将输出256,而不是100print(c)将输出100,而不是256。还要注意c是一个字符串,但a不是,所以你的答案实际上是将int转换为字符串,而不是反过来(这就是问题所在)。 - André Laszlo
感谢您的回复,我同意我的答案不正确,现在我已经修正了它。然而,我意识到答案的一部分是多余的,即使用int(string,base),但仍然相信答案的其余部分为帖子增加了更多选项。您同意吗? - Soundararajan
不相关;这是关于从16进制转换为10进制,而不是相反的方向。 - pppery

1

处理十六进制、八进制、二进制、整数和浮点数

使用标准前缀(即0x、0b、0和0o),此函数将把任何适当的字符串转换为数字。我在这里回答了这个问题:https://dev59.com/wXRC5IYBdhLWcg3wMeDf#58997070,但这是所需的函数。

def to_number(n):
    ''' Convert any number representation to a number 
    This covers: float, decimal, hex, and octal numbers.
    '''

    try:
        return int(str(n), 0)
    except:
        try:
            # python 3 doesn't accept "010" as a valid octal.  You must use the
            # '0o' prefix
            return int('0o' + n, 0)
        except:
            return float(n)

1
@SergeyVoronezhskiy,3.8.2和3.9仍然不将“010”识别为八进制(十进制8)。看起来它们仍然需要“0o”前缀。我相信这是为了避免将0填充的数字解释为非常罕见的八进制数。因此,自我在2019年发布此答案以来,实际上没有任何变化。 - shrewmouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接