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".
Answer from ecatmur on Stack OverflowYou 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".
Yet another way using binascii.hexlify():
>>> import binascii
>>> binascii.hexlify(b'\x12\x34\x56\x78')
b'12345678'
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'
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("")
The hex codec has been chucked in 3.x. Use binascii instead:
>>> binascii.hexlify(b'hello')
b'68656c6c6f'
In Python 3.5+, encode the string to bytes and use the hex() method, returning a string.
s = "hello".encode("utf-8").hex()
s
# '68656c6c6f'
Optionally convert the string back to bytes:
b = bytes(s, "utf-8")
b
# b'68656c6c6f'
When to use raw_unicode_escape mode
The backslash character is escaped so is written as \\. If you don't want that try the 'raw_unicode_escape' codec.
In the editor here, when answering your question, if I write \\ you see \ in the response so I actually had to write \\\\. Try it yourself to see what I mean (or edit this answer to see what I mean).
This is what I actually had to write above
The backslash character is escaped so is written as \\\\.
If you don't want that try the 'raw_unicode_escape' codec.
In the editor here, when answering your question, if I write \\\\
you see \\ in the response so I actually had to write
\\\\\\\\. Try it yourself to see what I mean (or edit this answer
to see what I mean).
By escaping the backspash the unicode_escape codec guards against problems like that.
You are using here bytes not bytearray
So, if you want to encode and decode keeping the '\x', you can use
'\x88'.encode('raw_unicode_escape')
b'\x88'.decode('unicode_escape')
If what you have is a single value bytearray like this:
barray = bytearray([0x88])
you can get the string of this byte this way:
s = format(barray[0], '02x')