pythonstringhex

Print a variable in hexadecimal in Python


I'm trying to find a way to print a string in hexadecimal. For example, I have this string which I then convert to its hexadecimal value.

my_string = "deadbeef"
my_hex = my_string.decode('hex')

How can I print my_hex as 0xde 0xad 0xbe 0xef?

To make my question clear... Let's say I have some data like 0x01, 0x02, 0x03, 0x04 stored in a variable. Now I need to print it in hexadecimal so that I can read it. I guess I am looking for a Python equivalent of printf("%02x", my_hex). I know there is print '{0:x}'.format(), but that won't work with my_hex and it also won't pad with zeroes.


Solution

  • You mean you have a string of bytes in my_hex which you want to print out as hex numbers, right? E.g., let's take your example:

    >>> my_string = "deadbeef"
    >>> my_hex = my_string.decode('hex')  # python 2 only
    >>> print my_hex
    Þ ­ ¾ ï
    

    This construction only works on Python 2; but you could write the same string as a literal, in either Python 2 or Python 3, like this:

    my_hex = "\xde\xad\xbe\xef"
    

    So, to the answer. Here's one way to print the bytes as hex integers:

    >>> print " ".join(hex(ord(n)) for n in my_hex)
    0xde 0xad 0xbe 0xef
    

    The comprehension breaks the string into bytes, ord() converts each byte to the corresponding integer, and hex() formats each integer in the from 0x##. Then we add spaces in between.

    Bonus: If you use this method with unicode strings (or Python 3 strings), the comprehension will give you unicode characters (not bytes), and you'll get the appropriate hex values even if they're larger than two digits.

    Addendum: Byte strings

    In Python 3 it is more likely you'll want to do this with a byte string; in that case, the comprehension already returns ints, so you have to leave out the ord() part and simply call hex() on them:

    >>> my_hex = b'\xde\xad\xbe\xef'
    >>> print(" ".join(hex(n) for n in my_hex))
    0xde 0xad 0xbe 0xef