使用库函数有很多方法可以做到这一点。但我偏向于第三方bitarray模块。
>>> import bitarray
>>> ba = bitarray.bitarray()
从字符串转换需要一些仪式。曾几何时,您可以只使用fromstring,但该方法现在已被弃用,因为它必须将字符串隐式编码为字节。为避免不可避免的编码错误,最好将bytes 对象传递给frombytes。从字符串开始时,这意味着您必须明确指定编码 - 无论如何这是一个好习惯。
>>> ba.frombytes('Hi'.encode('utf-8'))
>>> ba
bitarray('0100100001101001')
转换为列表很容易。 (另外,位串对象已经有很多类似列表的函数了。)
>>> l = ba.tolist()
>>> l
[False, True, False, False, True, False, False, False,
False, True, True, False, True, False, False, True]
bitstrings 可以从任何可迭代对象中创建:
>>> bitarray.bitarray(l)
bitarray('0100100001101001')
转换回字节或字符串也相对容易:
>>> bitarray.bitarray(l).tobytes().decode('utf-8')
'Hi'
为了纯粹的娱乐:
>>> def s_to_bitlist(s):
... ords = (ord(c) for c in s)
... shifts = (7, 6, 5, 4, 3, 2, 1, 0)
... return [(o >> shift) & 1 for o in ords for shift in shifts]
...
>>> def bitlist_to_chars(bl):
... bi = iter(bl)
... bytes = zip(*(bi,) * 8)
... shifts = (7, 6, 5, 4, 3, 2, 1, 0)
... for byte in bytes:
... yield chr(sum(bit << s for bit, s in zip(byte, shifts)))
...
>>> def bitlist_to_s(bl):
... return ''.join(bitlist_to_chars(bl))
...
>>> s_to_bitlist('Hi')
[0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1]
>>> bitlist_to_s(s_to_bitlist('Hi'))
'Hi'