2015-06-03 25 views
0

說我打開Python中的文件,其中包含了一系列的二進制數據。在Python中將二進制數據解析爲單獨的變量?

with open(sys.argv[1]) as data_file: 
    logData = data_file.read() 

我基本上要創建一個循環說:

for each_word in logData: 
     var1 = first 8 bytes 
     var2 = next 16 bytes 
     var3 = next 8 bytes 

C代碼生成我的二進制文件:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
     FILE *file; 
     int buffer = 0x03000201; 
     int buffer2= 0x010203; 
     file = fopen("test.bin", "wb"); 

     if (file != NULL) 
     { 
       fwrite(&buffer, sizeof(buffer), 1, file); 
       fwrite(&buffer2, sizeof(buffer2), 1, file); 
       fclose(file); 
     } 

     return 0; 
} 

,這基本上延續,直到循環結束,通過迭代數據的字節。這怎麼可能?

回答

3

使用struct module,它也將讓你去解釋在許多方面的二進制數據;需要在與該庫記錄的字符串格式來定義的類型:

struct.unpack('=HHf255s', bytes) 

上面的例子預計天然字節順序,兩個無符號短褲,浮子和255個字符的字符串。

你的代碼示例變爲:

for each_word in logData: 
    var1, var2, var3 = struct.unpack('8s16s8s', each_word) 

如果你得到一個錯誤TypeError: 'str' does not support the buffer interface,那是因爲bytes預期,但你通過了str,所以它轉換爲字節,並指定編碼(在本例,UTF-8):

for each_word in logData: 
    var1, var2, var3 = struct.unpack('8s16s8s', bytes(each_word, 'utf-8')) 

但也許你的8/16字節字符串是長整數的情況?在這種情況下,使用適當的格式來存放結構。

編輯:原來你想讀8 (不是字節),然後在接下來的16位,那麼接下來的8位,所以你可以把它讀作一個(無符號?)字節,一個簡而言之,另一個字節。您應使用的格式字符串是'=bhb'(或'=BHB'未簽名)。例如:

import struct 
with open('test.bin','rb') as f: 
    var1, var2, var3 = struct.unpack('=BHB', f.read(4)) 
    print(var1, var2, var3) 
+0

註釋不是延長討論;這次談話一直[移動聊天](​​http://chat.stackoverflow.com/rooms/79588/discussion-on-answer-by-mescalinum-parsing-binary-data-into-separate-variables-i)。 – Taryn

+0

非常感謝!這非常完美。 – rayn