尽管有很多相关问题,但我找不到任何符合我问题的问题。我想将二进制字符串(例如 "0110100001101001"
)更改为字节数组(同一个示例, b"hi"
)。
我试过这个:
bytes([int(i) for i in "0110100001101001"])
但我得到了:
b'\x00\x01\x01\x00\x01' #... and so on
在 Python 3 中执行此操作的正确方法是什么?
原文由 Numeri 发布,翻译遵循 CC BY-SA 4.0 许可协议
下面是按照 Patrick 提到的第一种方式执行此操作的示例:将位串转换为 int 并一次取 8 位。这样做的自然方法会以相反的顺序生成字节。为了让字节恢复正确的顺序,我在 bytearray 上使用扩展切片表示法,步长为 -1:
b[::-1]
。显然,帕特里克的第二种方式更为紧凑。 :)
但是,在 Python 3 中有一种更好的方法:使用 int.to_bytes 方法:
如果
len(s)
保证 是8的倍数,那么.to_bytes
的第一个arg可以简化:这将引发
OverflowError
如果len(s)
不是 8 的倍数,这在某些情况下可能是可取的。另一种选择是使用双重否定来执行上限除法。对于整数 a 和 b,底除法使用
//
给出整数 n 使得
n <= a/b < n + 1
例如,
47 // 10
给出4,并且-47 // 10
给出-5。所以-(-47 // 10)
给出 5,有效地执行上限划分。因此在
bitstring_to_bytes
我们 可以 这样做:然而,没有多少人熟悉这种高效紧凑的习语,因此通常认为它的可读性不如