Reputation: 336138
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.
Upvotes: 35
Views: 49881
Reputation: 1365
From python 3.5 you can simply use .hex()
:
>>> b'\x12\x34\x56\x78'.hex()
'12345678'
Upvotes: 3
Reputation: 721
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'
Upvotes: 9
Reputation: 157344
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".
Upvotes: 31
Reputation: 177620
Yet another way using binascii.hexlify()
:
>>> import binascii
>>> binascii.hexlify(b'\x12\x34\x56\x78')
b'12345678'
Upvotes: 14
Reputation: 90995
Using base64.b16encode()
:
>>> import base64
>>> base64.b16encode(b'\x12\x34\x56\x78')
b'12345678'
Upvotes: 11