我的计划中有这一行:TextV = base64.b64decode('0cQ+bNsObaw=')
,TextV
的值为b'\xd1\xc4>l\xdb\x0em\xac'
。然后我运行它将TextV转换为二进制文件:
TextVBin = ''.join(format(x, 'b') for x in bytearray(TextV))
,TextVBin
的值为'11010001110001001111101101100110110111110110110110101100'
。现在,我想再次将TextVBin格式转换为TextV格式(即b'\xd1\xc4>l\xdb\x0em\xac'
)但我用谷歌搜索,我找不到任何答案。我怎么能在Python 3中做到这一点?
答案 0 :(得分:2)
我会用:
import struct
TextVBin = "{:b}".format(struct.unpack(">Q", TextV)[0])
将您的TextV
转换为二进制字符串。
然而它产生的1101000111000100001111100110110011011011000011100110110110101100
与你自己的输出不同,但我想这是因为使用你自己的方法为每个字节截断前导0。所以你的方法是错误的。
使用struct:1101000111000100001111100110110011011011000011100110110110101100
使用你的:
1101000111000100 111110 110110011011011 1110 110110110101100
然后将此二进制字符串转换回字节:
int('1101000111000100001111100110110011011011000011100110110110101100', 2).to_bytes(8, 'big')
注意:我假设您的TextVBin是8字节长,并根据您的示例使用大端。如果长度是可变的,我的答案不适用。
答案 1 :(得分:0)
问题是您的格式字符串会截断前导零。你应该使用
TextVBin = ''.join('{:08b}'.format(x) for x in bytearray(TextV))
将使用正好8个二进制数字格式化每个字节。然后,反过来,只需做
TextV = bytearray([int(TextVBin[i:i+8], 2) for i in range(0, len(TextVBin), 8)])
例如:
>>> import base64
>>> TextV = base64.b64decode('0cQ+bNsObaw=')
>>> TextV
b'\xd1\xc4>l\xdb\x0em\xac'
>>> TextVBin = ''.join('{:08b}'.format(x) for x in bytearray(TextV))
>>> TextVBin
'1101000111000100001111100110110011011011000011100110110110101100'
>>> TextV = bytearray([int(TextVBin[i:i+8], 2) for i in range(0, len(TextVBin), 8)])
>>> TextV
bytearray(b'\xd1\xc4>l\xdb\x0em\xac')