35

In Python 2, to get a string representation of the hexadecimal digits in a string, you could do

>>> '\x12\x34\x56\x78'.encode('hex')
'12345678'

In Python 3, that doesn't work anymore (tested on Python 3.2 and 3.3):

>>> '\x12\x34\x56\x78'.encode('hex')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: unknown encoding: hex

There is at least one answer here on SO that mentions that the hex codec has been removed in Python 3. But then, according to the docs, it was reintroduced in Python 3.2, as a "bytes-to-bytes mapping".

However, I don't know how to get these "bytes-to-bytes mappings" to work:

>>> b'\x12'.encode('hex')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'encode'

And the docs don't mention that either (at least not where I looked). I must be missing something simple, but I can't see what it is.

Community
  • 1
  • 1
Tim Pietzcker
  • 328,213
  • 58
  • 503
  • 561
  • see this answer: http://stackoverflow.com/a/2340358/1298523 – scape Oct 16 '12 at 15:55
  • 3
    I would argue against closing this as a dupe. This question is specifically about Python 3.2 where the `hex` codec is officially back (but harder to find). The linked question is about Python 3.1. – Tim Pietzcker Oct 16 '12 at 16:07

4 Answers4

31

You need to go via the codecs module and the hex_codec codec (or its hex alias if available*):

codecs.encode(b'\x12', 'hex_codec')

* From the documentation: "Changed in version 3.4: Restoration of the aliases for the binary transforms".

Cristian Ciupitu
  • 20,270
  • 7
  • 50
  • 76
ecatmur
  • 152,476
  • 27
  • 293
  • 366
14

Yet another way using binascii.hexlify():

>>> import binascii
>>> binascii.hexlify(b'\x12\x34\x56\x78')
b'12345678'
Craig McQueen
  • 41,871
  • 30
  • 130
  • 181
Mark Tolonen
  • 166,664
  • 26
  • 169
  • 251
10

Using base64.b16encode():

>>> import base64
>>> base64.b16encode(b'\x12\x34\x56\x78')
b'12345678'
Craig McQueen
  • 41,871
  • 30
  • 130
  • 181
dan04
  • 87,747
  • 23
  • 163
  • 198
9

binascii methods are easier by the way:

>>> import binascii
>>> x=b'test'
>>> x=binascii.hexlify(x)
>>> x
b'74657374'
>>> y=str(x,'ascii')
>>> y
'74657374'
>>> x=binascii.unhexlify(x)
>>> x
b'test'
>>> y=str(x,'ascii')
>>> y
'test'
Cristian Ciupitu
  • 20,270
  • 7
  • 50
  • 76
iMagur
  • 721
  • 1
  • 6
  • 11