How to convert an int to a hex string?
Question:
I want to take an integer (that will be <= 255), to a hex string representation
e.g.: I want to pass in 65
and get out 'x41'
, or 255
and get 'xff'
.
I’ve tried doing this with the struct.pack('c',
65)
, but that chokes on anything above 9
since it wants to take in a single character string.
Answers:
You are looking for the chr
function.
You seem to be mixing decimal representations of integers and hex representations of integers, so it’s not entirely clear what you need. Based on the description you gave, I think one of these snippets shows what you want.
>>> chr(0x65) == 'x65'
True
>>> hex(65)
'0x41'
>>> chr(65) == 'x41'
True
Note that this is quite different from a string containing an integer as hex. If that is what you want, use the hex
builtin.
Try:
"0x%x" % 255 # => 0xff
or
"0x%X" % 255 # => 0xFF
Python Documentation says: “keep this under Your pillow: http://docs.python.org/library/index.html“
What about hex()
?
hex(255) # 0xff
If you really want to have
in front you can do:
print '\' + hex(255)[1:]
This will convert an integer to a 2 digit hex string with the 0x prefix:
strHex = "0x%0.2X" % integerVariable
If you want to pack a struct with a value <255 (one byte unsigned, uint8_t) and end up with a string of one character, you’re probably looking for the format B instead of c. C converts a character to a string (not too useful by itself) while B converts an integer.
struct.pack('B', 65)
(And yes, 65 is x41, not x65.)
The struct class will also conveniently handle endianness for communication or other uses.
I wanted a random integer converted into a six-digit hex string with a # at the beginning. To get this I used
"#%6x" % random.randint(0xFFFFFF)
Note that for large values, hex()
still works (some other answers don’t):
x = hex(349593196107334030177678842158399357)
print(x)
Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3: 0x4354467b746f6f5f736d616c6c3f7d
For a decrypted RSA message, one could do the following:
import binascii
hexadecimals = hex(349593196107334030177678842158399357)
print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
print(binascii.unhexlify(hexadecimals[2:])) # python 3
This worked best for me
"0x%02X" % 5 # => 0x05
"0x%02X" % 17 # => 0x11
Change the (2) if you want a number with a bigger width (2 is for 2 hex printned chars) so 3 will give you the following
"0x%03X" % 5 # => 0x005
"0x%03X" % 17 # => 0x011
As an alternative representation you could use
[in] '%s' % hex(15)
[out]'0xf'
Let me add this one, because sometimes you just want the single digit representation
( x
can be lower, ‘x’, or uppercase, ‘X’, the choice determines if the output letters are upper or lower.):
'{:x}'.format(15)
> f
And now with the new f''
format strings you can do:
f'{15:x}'
> f
To add 0 padding you can use 0>n
:
f'{2034:0>4X}'
> 07F2
NOTE: the initial ‘f’ in f'{15:x}'
is to signify a format string
With format()
, as per format-examples, we can do:
>>> # format also supports binary numbers
>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)
'int: 42; hex: 2a; oct: 52; bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)
'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()
For example:
>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'
Also you can convert any number in any base to hex. Use this one line code here it’s easy and simple to use:
hex(int(n,x)).replace("0x","")
You have a string n
that is your number and x
the base of that number. First, change it to integer and then to hex but hex has 0x
at the first of it so with replace
we remove it.
For Python >= 3.6, use f-string formatting:
>>> x = 114514
>>> f'{x:0x}'
'1bf52'
>>> f'{x:#x}'
'0x1bf52'
I want to take an integer (that will be <= 255), to a hex string representation
e.g.: I want to pass in 65
and get out 'x41'
, or 255
and get 'xff'
.
I’ve tried doing this with the struct.pack('c',
65)
, but that chokes on anything above 9
since it wants to take in a single character string.
You are looking for the chr
function.
You seem to be mixing decimal representations of integers and hex representations of integers, so it’s not entirely clear what you need. Based on the description you gave, I think one of these snippets shows what you want.
>>> chr(0x65) == 'x65'
True
>>> hex(65)
'0x41'
>>> chr(65) == 'x41'
True
Note that this is quite different from a string containing an integer as hex. If that is what you want, use the hex
builtin.
Try:
"0x%x" % 255 # => 0xff
or
"0x%X" % 255 # => 0xFF
Python Documentation says: “keep this under Your pillow: http://docs.python.org/library/index.html“
What about hex()
?
hex(255) # 0xff
If you really want to have in front you can do:
print '\' + hex(255)[1:]
This will convert an integer to a 2 digit hex string with the 0x prefix:
strHex = "0x%0.2X" % integerVariable
If you want to pack a struct with a value <255 (one byte unsigned, uint8_t) and end up with a string of one character, you’re probably looking for the format B instead of c. C converts a character to a string (not too useful by itself) while B converts an integer.
struct.pack('B', 65)
(And yes, 65 is x41, not x65.)
The struct class will also conveniently handle endianness for communication or other uses.
I wanted a random integer converted into a six-digit hex string with a # at the beginning. To get this I used
"#%6x" % random.randint(0xFFFFFF)
Note that for large values, hex()
still works (some other answers don’t):
x = hex(349593196107334030177678842158399357)
print(x)
Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3: 0x4354467b746f6f5f736d616c6c3f7d
For a decrypted RSA message, one could do the following:
import binascii
hexadecimals = hex(349593196107334030177678842158399357)
print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
print(binascii.unhexlify(hexadecimals[2:])) # python 3
This worked best for me
"0x%02X" % 5 # => 0x05
"0x%02X" % 17 # => 0x11
Change the (2) if you want a number with a bigger width (2 is for 2 hex printned chars) so 3 will give you the following
"0x%03X" % 5 # => 0x005
"0x%03X" % 17 # => 0x011
As an alternative representation you could use
[in] '%s' % hex(15)
[out]'0xf'
Let me add this one, because sometimes you just want the single digit representation
( x
can be lower, ‘x’, or uppercase, ‘X’, the choice determines if the output letters are upper or lower.):
'{:x}'.format(15)
> f
And now with the new f''
format strings you can do:
f'{15:x}'
> f
To add 0 padding you can use 0>n
:
f'{2034:0>4X}'
> 07F2
NOTE: the initial ‘f’ in
f'{15:x}'
is to signify a format string
With format()
, as per format-examples, we can do:
>>> # format also supports binary numbers
>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)
'int: 42; hex: 2a; oct: 52; bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)
'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()
For example:
>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'
Also you can convert any number in any base to hex. Use this one line code here it’s easy and simple to use:
hex(int(n,x)).replace("0x","")
You have a string n
that is your number and x
the base of that number. First, change it to integer and then to hex but hex has 0x
at the first of it so with replace
we remove it.
For Python >= 3.6, use f-string formatting:
>>> x = 114514
>>> f'{x:0x}'
'1bf52'
>>> f'{x:#x}'
'0x1bf52'