ovgolovin
ovgolovin

Reputation: 13410

HEX decoding in Python 3.2

In Python 2.x I'm able to do this:

>>> '4f6c6567'.decode('hex_codec')
'Oleg'

But in Python 3.2 I encounter this error:

>>> b'4f6c6567'.decode('hex_codec')
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    b'4f6c6567'.decode('hex_codec')
TypeError: decoder did not return a str object (type=bytes)

According to the docs hex_codec should provide "bytes-to-bytes mappings". So the object of byte-string is correctly used here.

How can I get rid of this error to be able to avoid unwieldy workarounds to convert from hex-encoded text?

Upvotes: 7

Views: 9704

Answers (1)

Sven Marnach
Sven Marnach

Reputation: 602485

In Python 3, the bytes.decode() method is used to decode raw bytes to Unicode, so you have to get the decoder from the codecs module using codecs.getdecoder() or codecs.decode() for bytes-to-bytes encodings:

>>> codecs.decode(b"4f6c6567", "hex_codec")
b'Oleg'
>>> codecs.getdecoder("hex_codec")(b"4f6c6567")
(b'Oleg', 8)

The latter function seems to be missing from the documentation, but has a useful docstring.

You might also want to have a look at binascii.unhexlify().

Upvotes: 12

Related Questions