如何在 Python 3 中将二进制字符串转换为类字节对象?

How to Convert Binary String to Byte-like Object in Python 3?

我的程序中有这一行: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 中执行此操作?

我会使用:

import struct
TextVBin = "{:b}".format(struct.unpack(">Q", TextV)[0])

将您的 TextV 转换为二进制字符串。

然而,它产生的 1101000111000100001111100110110011011011000011100110110110101100 与您自己的输出不同,但我猜这是因为使用您自己的方法,每个字节的前导 0 都被截断了。所以你的方法是错误的。

使用结构:1101000111000100001111100110110011011011000011100110110110101100

使用你的: 1101000111000100 111110 110110011011011 1110 110110110101100

然后将这个二进制字符串转换回字节:

int('1101000111000100001111100110110011011011000011100110110110101100', 2).to_bytes(8, 'big')

注意:根据您的示例,我假设您的 TextVBin 长 8 个字节并且是大端。如果长度是可变的,我的回答不适用。

问题是您的格式字符串截断了前导零。你应该使用

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')