2016-11-30 230 views
1

我想讀取一個二進制文件,獲取四個字節的內容四個字節,並對這些數據包執行整型操作。Python3讀取一個二進制文件,一次4個字節,異或它與一個4個字節的長鍵

使用一個虛擬的二進制文件,打開這樣:

with open('MEM_10001000_0000B000.mem', 'br') as f: 
    for byte in f.read(): 
      print (hex(byte)) 

我想用一個4字節長的關鍵,例如進行加密,0x9485A347

是否有一種簡單的方法,我可以一次讀取4個字節的文件,並將它們作爲int或我需要使用計數器將它們放入臨時結果中?

我最初的想法是這樣的:

 current_tmp = [] 
     for byte in data: 
      current_tmp.append(int(byte)) 
      if (len(current_tmp) == 4): 
        print (current_tmp) 
        # but current_tmp is an array not a single int 
        current_tmp = [] 

在我的例子,而不必[132, 4, 240, 215]我寧願有0x8404f0d7

回答

4

只需使用的看完了「量」參數讀取由4個字節時間和Python的3 int的「from_bytes」構造函數來得到它去:

with open('MEM_10001000_0000B000.mem', 'br') as f: 
    data = f.read(4) 
    while data: 
     number = int.from_bytes(data, "big") 
     ... 
     data = f.read(4) 

如果你不是USI NG的Python 3但出於某種原因,int不會設有from_bytes方法 - 那麼你可以訴諸使用結構模塊:但是

import struct 
... 
    number = struct.unpack(">i", data)[0] 
    ... 

這些方法都不錯的一對夫婦interations,並可以得到一個緩慢大文件 - 的Python爲您提供一種簡單地從一個OPENFILE填寫的4個字節的整數數組在內存中直接的方式 - 這是更可能是你應該用什麼:

import array, os 
numbers = array.array("i") 
with open('MEM_10001000_0000B000.mem', 'br') as f: 
    numbers.fromfile(f, os.stat('MEM_10001000_0000B000.mem').st_size // numbers.itemsize) 
numbers.byteswap() 

一旦你的陣列,你可以用類似

from functools import reduce #not needed in Python2.7 
result = reduce(lambda result, input: result^input, numbers, key) 

會給你一個numbers序列,你的文件中的所有數字都以4字節,大端,有符號整數的形式讀入。

如果你的文件不是4字節的倍數,前兩種方法可能需要一些調整 - 修復while條件就足夠了。

+0

該OP希望'[132,4,240,215]'轉換爲'0x8404f0d7',即您需要big-endian。 –

+2

如果文件大小不是4的倍數,還要小心最後一個字節...... –

+0

謝謝 - 修正了這兩個問題 – jsbueno

相關問題