数据类型在附加到列表时以某种方式被转换

Data type somehow gets converted when appended to a list

我正在尝试使用 ASCII 编码将文本转换为二进制,然后将二进制解码回文本作为大型项目的概念证明。下面的代码运行良好并且做了它应该做的事情:

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)

但是,当我尝试将 output_data 的给定值附加到 for 循环中的列表时,由于某些奇怪的原因,字符串被转换为十六进制。

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)

输出:

0b1001000
0b1100101
0b1101100
0b1101100
0b1101111
H
e
l
l
o
['\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00l', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00l', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o']

我不知道为什么会这样,有什么解释吗?

您误用了 int.to_bytes 方法。正如文档所述,

int.to_bytes(length, byteorder, *, signed=False)

Return an array of bytes representing an integer. [...]

The integer is represented using length bytes.

您使用了 byte_int.to_bytes(byte_int, 'big'),因此您将例如整数 72 转换为长度为 72 的字节字符串,这会在代表您的值的字节之前为您提供 71 个空字节。

你想要一个字节,所以使用

output_data = str(byte_int.to_bytes(1, 'big').decode('ascii'))

当您打印 list 对象本身而不是其内容时,实际内容不会以表示方式打印。这就是您看到十六进制值的原因。

要实现您想要的效果,只需解压列表即可:

print(*output_data)

或者这样:

for item in output_list:
    print(item, end=' ')