数据类型在附加到列表时以某种方式被转换
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=' ')
我正在尝试使用 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=' ')