2017-01-02 39 views
0

我通過一次讀入大塊數據來解析Python中的文件。使用struct.unpack,我可以將大塊數據解析爲整數,字符串和其他類型的組件。Python將字符串當作位數組

數據的結構是64位的二進制數據和64位的填充。

例如

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

藉助於此,我可以解壓結構成一個64位長的「串」具有填充的64位。

我的主要目標是取64位「字符串」res [0]並將其反轉。 (將1s切換爲0,反之亦然)

但是,如何將此字符串轉換爲位數組並對其進行處理?

請注意 - 由於「字符串」本身不是二進制數據的字符串表示形式,因此還會打印res [0]給出一堆亂碼,而不是1和0。位數組被視爲字符串...

回答

3

具體而言,它被解釋爲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 
+0

謝謝你的解釋!這工作完美! – wayway