Num*_*ica 7 python binary bytearray python-3.x
尽管存在许多相关问题,但我找不到任何与我的问题相符的问题.我想将二进制字符串(例如"0110100001101001")更改为字节数组(相同的示例b"hi").
我试过这个:
bytes([int(i) for i in "0110100001101001"])
Run Code Online (Sandbox Code Playgroud)
但我得到了:
b'\x00\x01\x01\x00\x01' #... and so on
Run Code Online (Sandbox Code Playgroud)
在Python 3中执行此操作的正确方法是什么?
PM *_*ing 11
下面是Patrick提到的第一种方式:将bitstring转换为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))
Run Code Online (Sandbox Code Playgroud)
显然,帕特里克的第二种方式更紧凑.:)
但是,在Python 3中有更好的方法:使用int.to_bytes方法:
def bitstring_to_bytes(s):
return int(s, 2).to_bytes(len(s) // 8, byteorder='big')
Run Code Online (Sandbox Code Playgroud)
您必须将其一次转换为一个int并取8位,或者将其切成8个字节长的字符串,然后将每个字符串转换为int。在Python 3中,正如PM 2Ring和JF Sebastian的答案所示,的to_bytes()方法int使您可以非常有效地执行第一种方法。这在Python 2中不可用,因此对于那些坚持这一点的人来说,第二种方法可能更有效。这是一个例子:
>>> s = "0110100001101001"
>>> bytes(int(s[i : i + 8], 2) for i in range(0, len(s), 8))
b'hi'
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,范围语句从索引0开始,为我们提供了到源字符串的索引,但一次却增加了8个索引。由于s长度为16个字符,它将为我们提供两个索引:
>>> list(range(0, 50, 8))
[0, 8, 16, 24, 32, 40, 48]
>>> list(range(0, len(s), 8))
[0, 8]
Run Code Online (Sandbox Code Playgroud)
(我们list()在这里用来显示将从Python 3的范围迭代器中检索到的值。)
然后,我们可以以此为基础,通过截取8个字符长的片段来将字符串分开:
>>> [s[i : i + 8] for i in range(0, len(s), 8)]
['01101000', '01101001']
Run Code Online (Sandbox Code Playgroud)
然后,我们可以将它们分别转换为以2为基的整数:
>>> list(int(s[i : i + 8], 2) for i in range(0, len(s), 8))
[104, 105]
Run Code Online (Sandbox Code Playgroud)
最后,我们将整个内容包装起来bytes()以获得答案:
>>> bytes(int(s[i : i + 8], 2) for i in range(0, len(s), 8))
b'hi'
Run Code Online (Sandbox Code Playgroud)
>>> zero_one_string = "0110100001101001"
>>> int(zero_one_string, 2).to_bytes((len(zero_one_string) + 7) // 8, 'big')
b'hi'
Run Code Online (Sandbox Code Playgroud)
它返回的bytes对象是不可变的字节序列.如果你想获得一个bytearray- 一个可变的字节序列 - 然后只需要调用bytearray(b'hi').