繁体   English   中英

Python将String视为位数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM