Python将字符串视为位数组
我通过一次读取一块数据来解析Python中的文件。使用struct.unpack,我可以将数据块解析为整数、字符串和其他类型的组件 数据的结构是64位二进制数据和64位填充 比如说Python将字符串视为位数组,python,arrays,python-2.7,parsing,bit-manipulation,Python,Arrays,Python 2.7,Parsing,Bit Manipulation,我通过一次读取一块数据来解析Python中的文件。使用struct.unpack,我可以将数据块解析为整数、字符串和其他类型的组件 数据的结构是64位二进制数据和64位填充 比如说 res = struct.unpack('>64s64x', s) 有了这个,我可以将结构解压成一个64位长的“字符串”,其中包含64位的填充 我的主要目标是获取64位的“字符串”,res[0],并将其反转。(将1切换到0,反之亦然) 但是,如何将该字符串转换为位数组并对其进行处理 注意-同样,打印res[0
res = struct.unpack('>64s64x', s)
有了这个,我可以将结构解压成一个64位长的“字符串”,其中包含64位的填充
我的主要目标是获取64位的“字符串”,res[0],并将其反转。(将1切换到0,反之亦然)
但是,如何将该字符串转换为位数组并对其进行处理
注意-同样,打印res[0]也会产生一些乱码,而不是1和0,因为“字符串”本身不是二进制数据的字符串表示形式。位数组被视为字符串 具体来说,它被解释为
字节
(与Python 2中的str
相同,但不是3)。如果您的目标只是反转数据位,这相当简单,您可以使用ord()
获取字符的int值,然后使用0xff
的按位异或进行反转(我将使用一个简单的字符串作为示例字符串):
如果您需要将数据以字节形式传递回某个位置:
result = ''.join(chr(ord(x) ^ 0xff) for x in data)
如果要检查单个位的值,可以使用位屏蔽(这是执行此操作的标准方法,即使在C中也是如此):
具体来说,它被解释为
字节
(与Python 2中的str
相同,但不是3)。如果您的目标只是反转数据位,这相当简单,您可以使用ord()
获取字符的int值,然后使用0xff
的按位异或进行反转(我将使用一个简单的字符串作为示例字符串):
如果您需要将数据以字节形式传递回某个位置:
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