18
votes

I would create a python script that decode a Base64 string to an array of byte (or array of Hex values).

The embedded side of my project is a micro controller that creates a base64 string starting from raw byte. The string contains some no-printable characters (for this reason I choose base64 encoding).

On the Pc side I need to decode the the base64 string and recover the original raw bytes.

My script uses python 2.7 and the base64 library:

base64Packet = raw_input('Base64 stream:')

packet = base64.b64decode(base64Packet )

sys.stdout.write("Decoded packet: %s"%packet)

The resulting string is a characters string that contains some not printable char.

Is there a way to decode base64 string to byte (or hex) values?

Thanks in advance!

1
You already have that bytestring. What output were you expecting and what do you see? Perhaps you wanted to use %r instead when printing?Martijn Pieters♦
@MartijnPieters: After decoding I would have a python list that contain each single byte.Federico
Why do you need that? Do you need to manipulate the bytes? A str object is already a sequence, you can address each byte with packet[index], for example, or loop over the string with for byte in packet:.Martijn Pieters♦
You can create the list by just using list(packet), producing a list of 1-character (byte) strings. Or perhaps you want to use a bytearray object instead, but it isn't clear what you want to do with your data. You haven't given us your use case.Martijn Pieters♦
Then you want a bytearray() instance; just use bytearray(packet). A bytearray is a mutable sequence of integers in the range 0-255, one integer per byte.Martijn Pieters♦

1 Answers

13
votes

You can use bytearray for exactly this. Possibly the binascii module and struct can be helpful, too.

import binascii
import struct

binstr=b"thisisunreadablebytes"

encoded=binascii.b2a_base64(binstr)
print encoded
print binascii.a2b_base64(encoded)

ba=bytearray(binstr)
print list(ba)

print binascii.b2a_hex(binstr)
print struct.unpack("21B",binstr)