How do I convert a hex string to an integer?
"0xffff" ⟶ 65535
"ffff" ⟶ 65535
Without the 0x prefix, you need to specify the base explicitly, otherwise there's no way to tell:
x = int("deadbeef", 16)
With the 0x prefix, Python can distinguish hex and decimal automatically:
>>> print(int("0xdeadbeef", 0))
3735928559
>>> print(int("10", 0))
10
(You must specify 0 as the base in order to invoke this prefix-guessing behavior; if you omit the second parameter, int() will assume base-10.)
int("FFFF",16) to be converted to -1.int(hexstring, 16) does the trick, and works with and without the 0x prefix:
>>> int("a", 16)
10
>>> int("0xa", 16)
10
16 is for base 16. Normally people use base 10 (and in Python there's an implicit 10 when you don't pass a second argument to int()), where you start at 0 then count up 0123456789 (10 digits in total) before going back to 0 and adding 1 to the next units place. In base 16 (also called "hexadecimal" or "hex" for short) you start at 0 then count up 0123456789ABCDEF (16 digits in total). The int function accepts any number from 2 and 36 as the base, it just extends the alphabet: base 36 is 0123456789ABCEDFGHIJKLMNOPQRSTUVWXYZ.Convert hex string to int in Python
I may have it as
"0xffff"or just"ffff".
To convert a string to an int, pass the string to int along with the base you are converting from.
Both strings will suffice for conversion in this way:
>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535
int inferIf you pass 0 as the base, int will infer the base from the prefix in the string.
>>> int(string_1, 0)
65535
Without the hexadecimal prefix, 0x, int does not have enough information with which to guess:
>>> int(string_2, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'
If you're typing into source code or an interpreter, Python will make the conversion for you:
>>> integer = 0xffff
>>> integer
65535
This won't work with ffff because Python will think you're trying to write a legitimate Python name instead:
>>> integer = ffff
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined
Python numbers start with a numeric character, while Python names cannot start with a numeric character.
Adding to Dan's answer above: if you supply the int() function with a hex string, you will have to specify the base as 16 or it will not think you gave it a valid value. Specifying base 16 is unnecessary for hex numbers not contained in strings.
print int(0xdeadbeef) # valid
myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
eval is also absurdly slow, on top of all of the other issues with it.Or ast.literal_eval (this is safe, unlike eval):
ast.literal_eval("0xffff")
Demo:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
int(..., base=16)0xFFFF_FFFF too, however it doesn't allow leading zeros. literal_eval("010") will raise an error.int(x, 0) handles those cases too, so this seems to be exactly the same. See my answer.Handles hex, octal, binary, int, and float
Using the standard prefixes (i.e. 0x, 0b, 0, and 0o) this function will convert any suitable string to a number. I answered this here: https://stackoverflow.com/a/58997070/2464381 but here is the needed function.
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)
0o prefix. I'm sure that this is to avoid interpreting 0 padded numbers as the very uncommon octal. So, really nothing has changed since I posted this answer in 2019.Unfortunately it seems like none of the existing options are ideal, so I would go with the function below.
| Method | 15 |
0xf |
0b1111 |
0x0_f |
015 |
|---|---|---|---|---|---|
int(x) |
15 | Error | Error | Error | 15 |
int(x, 0) |
15 | 15 | 15 | 15 | Error |
ast.literal_eval(x) |
15 | 15 | 15 | 15 | Error |
parse_int(x) (below) |
15 | 15 | 15 | 15 | 15 |
def parse_int(s: str) -> int:
try:
return int(x, 0)
except ValueError:
return int(x)
This works in every case.
The formatter option '%x' % seems to work in assignment statements as well for me. (Assuming Python 3.0 and later)
Example
a = int('0x100', 16)
print(a) #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100
print(b) will output 256, not 100 and print(c) will output 100, not 256. Also note that c is a string, but a is not so your answer actually converts an int to a string, not the other way around (this is what the question is about).
0xffffwithout quotes, it's already an integer literal.