I am trying to convert text to binary using ASCII encoding, and then decode the binary back to text as proof of concept for a larger project. The following code works well and does what it is supposed to do:
bytes = [] input_data = "Hello" for b in input_data: new_byte = bin(int.from_bytes(b.encode('ascii'), 'big')) bytes.append(new_byte) for x in bytes: print(x) for byte in bytes: byte_int = int(byte, 2) output_data = str(byte_int.to_bytes(byte_int, 'big').decode('ascii')) print(output_data)
However, as soon as I try to append the given value of output_data
to a list within the for loop, the strings become converted to HEX for some odd reason.
bytes = [] output_list = [] input_data = "Hello" for b in input_data: new_byte = bin(int.from_bytes(b.encode('ascii'), 'big')) bytes.append(new_byte) for x in bytes: print(x) for byte in bytes: byte_int = int(byte, 2) output_data = str(byte_int.to_bytes(byte_int, 'big').decode('ascii')) print(output_data) output_list.append(output_data) print(output_list)
With the output:
0b1001000 0b1100101 0b1101100 0b1101100 0b1101111 H e l l o ['x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00H', 'x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00e', 'x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00l', 'x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00l', 'x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00o']
I have no idea why this happens, is there any explanation?
Advertisement
Answer
You misused the int.to_bytes method. As the doc states,
int.to_bytes(length, byteorder, *, signed=False)
Return an array of bytes representing an integer. […]
The integer is represented using length bytes.
You used byte_int.to_bytes(byte_int, 'big')
, so you convert for example the integer 72 into a byte string of length 72, which gives you 71 null bytes before the one representing your value.
You want a single byte, so use
output_data = str(byte_int.to_bytes(1, 'big').decode('ascii'))