在python中将十六进制字符串转换为int

Convert hex string to int in Python

如何在Python中将十六进制字符串转换为int?

我可以用"EDOCX1"〔0〕或"EDOCX1"〔1〕来表示。


如果没有0x前缀,则需要显式指定基,否则就无法判断:

1
x = int("deadbeef", 16)

使用0x前缀,python可以自动区分十六进制和十进制。

1
2
3
4
>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10

(必须指定0作为基,以便调用此前缀猜测行为;省略第二个参数意味着假定基10。)


int(hexString, 16)完成了这个技巧,可以使用或不使用0x前缀:

1
2
3
4
>>> int("a", 16)
10
>>> int("0xa",16)
10


对于任何给定的字符串:

1
int(s, 16)

Convert hex string to int in Python

I may have it as "0xffff" or just "ffff".

要将字符串转换为int,请将该字符串与要转换的基一起传递给int

两个字符串都可以通过这种方式进行转换:

1
2
3
4
5
6
>>> string_1 ="0xffff"
>>> string_2 ="ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535

int推断

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

1
2
>>> int(string_1, 0)
65535

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

1
2
3
4
>>> 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将为您进行转换:

1
2
3
>>> integer = 0xffff
>>> integer
65535

这不适用于ffff,因为python会认为您正在尝试编写合法的python名称:

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

python数字以数字字符开头,而python名称不能以数字字符开头。


加上上面丹的回答:如果您为int()函数提供一个十六进制字符串,则必须将基指定为16,否则它将认为您没有给它一个有效的值。对于未包含在字符串中的十六进制数,不需要指定基数16。

1
2
3
4
5
print int(0xdeadbeef) # valid

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

最坏的方式:

1
2
3
4
5
>>> def hex_to_int(x):
    return eval("0x" + x)

>>> hex_to_int("c0ffee")
12648430

请不要这样做!

在python中使用eval是一种坏做法吗?


或者是ast.literal_eval(这是安全的,不像eval):

1
ast.literal_eval("0xffff")

演示:

1
2
3
4
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>

在python 2.7中,int('deadbeef',10)似乎不起作用。

以下对我有效:

1
2
3
>>a = int('deadbeef',16)
>>float(a)
3735928559.0


格式化程序选项"%x"似乎也适用于赋值语句。(假设python 3.0及更高版本)

例子

1
2
3
4
5
6
7
a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100


前缀为"0x"时,也可以使用eval函数

例如

1
2
3
>>a='0xff'
>>eval(a)
255