28

Has HEX codec been excluded from Python 3.3? When I write the code

>>> s="Hallo"
>>> s.encode('hex')
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    s.encode('hex')
LookupError: unknown encoding: hex

What does that mean? I know about binascii.hexlify() but still .encode() method is nice!

Any suggestion?

3
  • 3
    there is bugs.python.org/issue7475 Commented Nov 18, 2012 at 0:34
  • 1
    SO, 'hex' code is missing! Is there any way to add that codec or method, there are two files on your link, what does that do? Commented Nov 18, 2012 at 5:49
  • To convert numbers in hex, you can still use hex(n). Commented May 4, 2014 at 15:48

3 Answers 3

52

No, using encode() to hexlify isn't nice.

The way you use the hex codec worked in Python 2 because you can call encode() on 8-bit strings in Python 2, ie you can encode something that is already encoded. That doesn't make sense. encode() is for encoding Unicode strings into 8-bit strings, not for encoding 8-bit strings as 8-bit strings.

In Python 3 you can't call encode() on 8-bit strings anymore, so the hex codec became pointless and was removed.

Although you theoretically could have a hex codec and use it like this:

>>> import codecs
>>> hexlify = codecs.getencoder('hex')
>>> hexlify(b'Blaah')[0]
b'426c616168'

Using binascii is easier and nicer:

>>> import binascii
>>> binascii.hexlify(b'Blaah')
b'426c616168'
Sign up to request clarification or add additional context in comments.

3 Comments

binascii.hexlify() need buffer interface, right? So, can somebody please explain me how to perform formatting on buffer interface?
@iMagur: Sorry, I forgot to make the code Python 3 code, since I made it in Python 2 (as the hex_codec doesn't exist in Python 3). This has now been fixed. The above binascii code works in Python 3, and shows you how to do it. In Python 3 strings are Unicode, so they can't be hexlified directly, you need to encode them as bytes first.
This is good because frankly there is a lot of 8 bit usage going on out there. Particularly between ('ascii') , ('IBM500'), ('IBM037'). What was really needed out of the box was a number of "OD" style hex methods for strings. Python is chosen to reduce effort and these things double the code required.. Yes I know IBM500 is unicode..
2

this is the same answer for the above but i modified it so it works with python 3.

import binascii
from Crypto.Cipher import AES
from Crypto import Random

def encrypt(passwrd, message):
    msglist = []
    key = bytes(passwrd, "utf-8")
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(key, AES.MODE_CFB, iv)
    msg = iv + cipher.encrypt(bytes(message, "utf-8"))
    msg = binascii.hexlify(msg)
    for letter in str(msg):
        msglist.append(letter)
    msglist.remove("b")
    msglist.remove("'")
    msglist.remove("'")
    for letter in msglist:
        print(letter, end="")
    print("")

def decrypt(passwrd, message):
    msglist = []
    key = bytes(passwrd, "utf-8")
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(key, AES.MODE_CFB, iv)
    msg = cipher.decrypt(binascii.unhexlify(bytes(message, "utf-8")))[len(iv):]
    for letter in str(msg):
        msglist.append(letter)
    msglist.remove("b")
    msglist.remove("'")
    msglist.remove("'")
    for letter in msglist:
        print(letter, end="")
    print("")

Comments

0

regebro's answer is right but if you need to define a variable this code may help.C is a str here.

import codecs

c='sdfds'
print(codecs.encode(c))

1 Comment

Your answer could be improved by adding more information on what the code does and how it helps the OP.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.