[英]Python treat String as array of bits
我通过一次读取大量数据来解析Python中的文件。 使用struct.unpack,我可以将数据块解析为整数,字符串和其他类型化的组件。
数据的结构是64位二进制数据和64位填充。
例如
res = struct.unpack('>64s64x', s)
这样,我可以将结构解压缩为64位长的“字符串”,并填充64位。
我的主要目标是获取64位“字符串”,res [0]并将其取反。 (将1切换为0,反之亦然)
但是,如何将该字符串转换为位数组并进行处理?
注意-由于“ string”本身不是二进制数据的字符串表示形式,因此打印res [0]也会产生一堆乱码,而不是1s和0s。 位数组被视为字符串...
具体来说,它被解释为bytes
(与Python 2中的str
相同,但不是3)。 如果您的目标只是反转数据的位,那很容易,您可以使用ord()
来获取字符的int值,然后将bitwise-xor与0xff
进行反转(我将使用一个简单的字符串字符作为示例字符串):
>>> 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.