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

Mat*_*att 708 python string hex

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

我可以把它作为" 0xffff"或只是" ffff".

Dan*_*ski 1006

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

x = int("deadbeef", 16)
Run Code Online (Sandbox Code Playgroud)

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

>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10
Run Code Online (Sandbox Code Playgroud)

(您必须指定0作为基础才能调用此前缀猜测行为;省略第二个参数意味着假定基数为10.)

  • 这意味着你应该总是使用16作为第二个参数.显式优于隐式. (19认同)
  • @bachsau,显然是不真实的.如果您想读取用户输入,允许以十六进制或十进制输入,以用户方便的方式怎么办? (9认同)
  • 好吧,我应该说:在这个特殊情况下!最初的问题是"如何转换十六进制字符串......".如果你想把它留给用户,那么它是一个有用的功能,你是对的. (6认同)

unw*_*ind 147

int(hexString, 16) 诀窍,并使用和不使用0x前缀:

>>> int("a", 16)
10
>>> int("0xa",16)
10
Run Code Online (Sandbox Code Playgroud)

  • @Max `16` 代表 [base 16](https://en.wikipedia.org/wiki/Base_16)。通常人们使用基数 10(在 Python 中,当你不向 `int()` 传递第二个参数时,就会有一个隐式的 `10`),从 `0` 开始,然后累加 `0123456789`(总共 10 位数字) ),然后返回到“0”并将 1 添加到下一个个位。在 16 进制(也称为“十六进制”或简称“十六进制”)中,您从“0”开始,然后累加“0123456789ABCDEF”(总共 16 位数字)。`int` 函数接受 2 到 36 中的任何数字作为基数,它只是扩展了字母表:基数 36 是 `0123456789ABCEDFGHIJKLMNOPQRSTUVWXYZ`。 (2认同)

Jor*_*ira 45

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

int(s, 16)
Run Code Online (Sandbox Code Playgroud)


Aar*_*all 37

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

我可能"0xffff"只是或者只是"ffff".

要将字符串转换为int,请将字符串传递给要转换int的基础.

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

>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535
Run Code Online (Sandbox Code Playgroud)

让我们int推断

如果以0为基数,int将从字符串中的前缀推断出基数.

>>> int(string_1, 0)
65535
Run Code Online (Sandbox Code Playgroud)

如果没有十六进制前缀0x,int没有足够的信息与猜测:

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

文字:

如果您输入源代码或解释器,Python将为您进行转换:

>>> integer = 0xffff
>>> integer
65535
Run Code Online (Sandbox Code Playgroud)

这不起作用,ffff因为Python会认为你正在尝试编写一个合法的Python名称:

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

Python数字以数字字符开头,而Python名称不能以数字字符开头.


Max*_*Max 12

添加上面的Dan的答案:如果你提供带有十六进制字符串的int()函数,你必须将基数指定为16,否则它不会认为你给它一个有效的值.对于不包含在字符串中的十六进制数,不需要指定基数16.

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
Run Code Online (Sandbox Code Playgroud)


And*_*zlo 8

最坏的方法:

>>> def hex_to_int(x):
    return eval("0x" + x)

>>> hex_to_int("c0ffee")
12648430
Run Code Online (Sandbox Code Playgroud)

请不要这样做!

在 Python 中使用 eval 是不好的做法吗?

  • 如果这是一个坏主意,那么提出它的意义何在? (5认同)
  • 好点子。部分是因为我认为它很有趣,部分是因为我在生产代码中看到过它。 (4认同)
  • 值得注意的是,除了所有其他问题之外,`eval` 也非常慢。 (3认同)
  • 刚刚投了反对票,但我会留下这个答案,因为它仍然......非常常见:https://github.com/search?l=Python&amp;q=%27eval%28%220x%22%27&amp;type=Code (2认同)

U10*_*ard 6

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

ast.literal_eval("0xffff")
Run Code Online (Sandbox Code Playgroud)

演示:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 这可行,但比 `int(..., base=16)` 慢得多 (2认同)