Python v3.3 encode('hex')
Asked Answered
B

3

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?

Barbour answered 17/11, 2012 at 23:41 Comment(3)
there is bugs.python.org/issue7475Intertwist
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?Barbour
To convert numbers in hex, you can still use hex(n).Nematic
A
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'
Auditor answered 18/11, 2012 at 6:3 Comment(3)
binascii.hexlify() need buffer interface, right? So, can somebody please explain me how to perform formatting on buffer interface?Barbour
@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.Auditor
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..Aloke
K
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("")
Kidskin answered 20/2, 2018 at 12:13 Comment(0)
T
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))
Thorp answered 25/3, 2023 at 2:42 Comment(1)
Your answer could be improved by adding more information on what the code does and how it helps the OP.Transform

© 2022 - 2024 — McMap. All rights reserved.