【问题标题】:How to Convert Binary String to Byte-like Object in Python 3?如何在 Python 3 中将二进制字符串转换为类似字节的对象?
【发布时间】:2017-03-13 14:36:59
【问题描述】:

我的程序中有这一行: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 中做到这一点?

【问题讨论】:

  • 所以我链接到的问题解决了你的问题?如果是这样,我会将其标记为 dup 目标。
  • 不,我没有得到我想要的输出,我得到了这个: b'\xd1\xc4\xfbf\xdfm\xac' 与 b'\xd1\xc4>l 不同\xdb\x0em\xac'
  • 那你是怎么解决你的问题的?
  • 如果您执行了步骤A->B->C,那么现在您必须执行C->B->A。首先你必须拆分文本,然后转换为字节数组等。

标签: python python-3.x binary base64


【解决方案1】:

我会使用:

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 字节长和大端。如果长度是可变的,我的回答不适用。

【讨论】:

  • 我可以将 struct.unpack 用于 16 字节对象吗?看来这只是 8 字节对象
【解决方案2】:

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

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

【讨论】:

  • 如何从中删除 bytearray?即,只返回 b'\xd1\xc4>l\xdb\x0em\xac'
  • 在 Python 3 上,使用 bytes 构造函数而不是 bytearray
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 2021-02-23
  • 2013-06-12
  • 2021-12-20
  • 2017-08-08
  • 1970-01-01
  • 2019-01-25
  • 2023-01-13
相关资源
最近更新 更多