如何在python3中将二进制字符串转换成Bytelike对象?

2024-09-27 21:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在我的程序中有这样一行: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'),但是我在google上找不到任何答案。如何在python3中实现这一点?在


Tags: 程序format格式二进制joinbase64xc4b64decode
2条回答

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

TextVBin = ''.join('{:08b}'.format(x) for x in bytearray(TextV))

它将用8个二进制数字格式化每个字节。然后,要逆转,只要做

^{pr2}$

例如:

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

我会用:

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

TextV转换为二进制字符串。在

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

使用结构:1101000111000100001111100110110011011011000011100110110110101100

使用您的: 1101000111000100 111110 110110011011011 1110 110110110101100

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

^{pr2}$

注意:根据您的示例,我假设您的TextVBin是8个字节长的big-endian。如果长度是可变的,我的答案不适用。在

相关问题 更多 >

    热门问题