Python将String视为位数组

时间:2017-01-02 18:40:46

标签: python arrays python-2.7 parsing bit-manipulation

我通过一次读取一大块数据来解析Python中的文件。使用struct.unpack,我可以将数据块解析为整数,字符串和其他类型的组件。

数据的结构是64位二进制数据和64位填充。

例如

res = struct.unpack('>64s64x', s)

有了这个,我可以将结构解压缩为64位长的#34;字符串"使用64位填充。

我的主要目标是取64位"字符串",res [0],然后将其反转。 (将1s切换为0,反之亦然)

但是,如何将此字符串转换为位数组并进行处理?

注意 - 同样打印res [0]给出了一堆乱码,而不是1和0,因为"字符串"本身不是二进制数据的字符串表示。位数组被视为字符串......

1 个答案:

答案 0 :(得分:3)

具体来说,它被解释为bytes(与Python 2中的str相同,但不是3)。如果您的目标只是反转数据的位,这很容易,您可以使用ord()来获取字符的int值,然后使用bitwise-xor和0xff来反转(I' ll使用一个简单的字符串作为示例字符串):

>>> data = 'abcdefgh'
>>> [ord(x) for x in data]
[97, 98, 99, 100, 101, 102, 103, 104]
>>> [ord(x) ^ 0xff for x in data]
[158, 157, 156, 155, 154, 153, 152, 151]

如果您需要将该数据作为字节传递回某处:

result = ''.join(chr(ord(x) ^ 0xff) for x in data)

如果要检查各个位的值,可以使用位屏蔽(这是执行此操作的标准方法,即使在C中):

>>> bool(ord('a') & 0x01)
True
>>> bool(ord('a') & 0x02)
False
>>> bool(ord('a') & 0x04)
False
>>> bool(ord('a') & 0x08)
False
>>> bool(ord('a') & 0x10)
False
>>> bool(ord('a') & 0x20)
True
>>> bool(ord('a') & 0x40)
True
>>> bool(ord('a') & 0x80)
False