gpt4 book ai didi

python - 在 Python 3 中将二进制字符串转换为字节数组

转载 作者:太空狗 更新时间:2023-10-29 21:17:20 24 4
gpt4 key购买 nike

尽管有很多相关问题,但我找不到与我的问题相匹配的问题。我想将二进制字符串(例如,"0110100001101001")更改为字节数组(同样的示例,b"hi")。

我试过这个:

bytes([int(i) for i in "0110100001101001"])

但是我得到了:

b'\x00\x01\x01\x00\x01' #... and so on

在 Python 3 中执行此操作的正确方法是什么?

最佳答案

这是按照 Patrick 提到的第一种方式执行此操作的示例:将位串转换为 int 并一次取 8 位。这样做的自然方法会以相反的顺序生成字节。为了让字节恢复到正确的顺序,我在 bytearray 上使用扩展切片表示法,步长为 -1:b[::-1]

def bitstring_to_bytes(s):
v = int(s, 2)
b = bytearray()
while v:
b.append(v & 0xff)
v >>= 8
return bytes(b[::-1])

s = "0110100001101001"
print(bitstring_to_bytes(s))

显然,帕特里克的第二种方式更为紧凑。 :)

但是,在 Python 3 中有更好的方法:使用 int.to_bytes方法:

def bitstring_to_bytes(s):
return int(s, 2).to_bytes((len(s) + 7) // 8, byteorder='big')

如果len(s)保证是8的倍数,那么.to_bytes的第一个arg可以简化:

return int(s, 2).to_bytes(len(s) // 8, byteorder='big')

如果 len(s) 不是 8 的倍数,这将引发 OverflowError,这在某些情况下可能是可取的。


另一种选择是使用双重否定来执行上限除法。对于整数 a 和 b,使用 //

进行底除法
n = a // b

给出整数 n 使得
n <= a/b < n + 1
例如,
47//10 给出 4,并且

-47//10 给出 -5。所以

-(-47//10) 给出 5,有效地执行上限划分。

因此在 bitstring_to_bytes 中我们可以做:

return int(s, 2).to_bytes(-(-len(s) // 8), byteorder='big')

然而,没有多少人熟悉这种高效紧凑的习语,因此通常认为它的可读性不如

return int(s, 2).to_bytes((len(s) + 7) // 8, byteorder='big')

关于python - 在 Python 3 中将二进制字符串转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32675679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com