How do I convert a hex string to an int in Python?
I may have it as “0xffff” or just “ffff“.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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.)
Method 2
int(hexstring, 16) does the trick, and works with and without the 0x prefix:
>>> int("a", 16)
10
>>> int("0xa", 16)
10
Method 3
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
Letting int infer
If 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'
literals:
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.
Method 4
For any given string s:
int(s, 16)
Method 5
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
Method 6
The worst way:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
Please don’t do this!
Is using eval in Python a bad practice?
Method 7
Or ast.literal_eval (this is safe, unlike eval):
ast.literal_eval("0xffff")
Demo:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
Method 8
If you are using the python interpreter, you can just type 0x(your hex value) and the interpreter will convert it automatically for you.
>>> 0xffff 65535
Method 9
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
Method 10
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)
Method 11
In Python 2.7, int('deadbeef',10) doesn’t seem to work.
The following works for me:
>>a = int('deadbeef',16)
>>float(a)
3735928559.0
Method 12
with ‘0x’ prefix, you might also use eval function
For example
>>a='0xff' >>eval(a) 255
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0