我通过一次读取一大块数据来解析Python中的文件。使用struct.unpack,我可以将数据块解析为整数,字符串和其他类型的组件。
数据的结构是64位二进制数据和64位填充。
例如
res = struct.unpack('>64s64x', s)
有了这个,我可以将结构解压缩为64位长的#34;字符串"使用64位填充。
我的主要目标是取64位"字符串",res [0],然后将其反转。 (将1s切换为0,反之亦然)
但是,如何将此字符串转换为位数组并进行处理?
注意 - 同样打印res [0]给出了一堆乱码,而不是1和0,因为"字符串"本身不是二进制数据的字符串表示。位数组被视为字符串......
答案 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