21

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!

9
  • You already have that bytestring. What output were you expecting and what do you see? Perhaps you wanted to use %r instead when printing? Commented Aug 29, 2016 at 15:28
  • @MartijnPieters: After decoding I would have a python list that contain each single byte. Commented Aug 29, 2016 at 15:31
  • 1
    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:. Commented Aug 29, 2016 at 15:32
  • 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. Commented Aug 29, 2016 at 15:33
  • 1
    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. Commented Aug 29, 2016 at 15:42

1 Answer 1

18

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)
Sign up to request clarification or add additional context in comments.

4 Comments

Thanks! Could you provide an example for the use of bytearray, binascii and struct to solve my problem? I'm not a master of python!
added examples - if you can be more specific on what input should become waht i can extend...
Thanks for your example! I obtain the list of integer values with this code line: stapacketString = list(bytearray(base64.b64decode(base64Packet))). Is this the correct way? For my scope this works.
Looks correct - actually bytearrays behave like lists (except for printing) so constructing a list is only needed for prettier printing. Glad I could help :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.