2016-11-30 2 views
1

バイナリファイルを読み込み、コンテンツを4バイトで4バイト取得し、これらのパケットに対してint操作を実行します。ダミーのバイナリファイルを使用してPython3は一度に4バイトずつバイナリファイルを読み込み、4バイトの長さのキーでxorを返します

は、この道を開い:

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

私は4バイト長のキー、例えば0x9485A347で暗号化を実行します。

ファイルを一度に4バイトずつ読み込み、intとして取得するか、カウンタを使用して一時的な結果にする必要がありますか?私はむしろ0x8404f0d7

答えて

4

ちょうどで4つのバイトを読み取るために読んでの「量」パラメータを使用する必要があります私の例では

 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]を有するので:

私のオリジナルのアイデアは以下のとおりです。あなたがいない場合はUSI

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) 

:時間は、とPythonの3 intの「from_bytes」コンストラクタは、それが軌道に乗るにしますintfrom_bytes方法を特徴としませんが、何らかの理由でまだPythonの3 ngを - そして、あなたは構造体モジュールを使用するために頼ることができます:

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

しかし、これらの方法はカップルのinterationsための優れている、とのために遅い得ることができます、

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() 

あなたは、配列を持っていたら:大きなファイルは - あなたが使用する必要がありますどのような可能性が高い - Pythonはあなたは、単にのOpenFileから直接メモリに4バイトの整数の配列を埋めるための方法を提供しています

のようなものでxorすることができます
from functools import reduce #not needed in Python2.7 
result = reduce(lambda result, input: result^input, numbers, key) 
from functools import reduce #not needed in Python2.7 
result = reduce(lambda result, input: result^input, numbers, key) 

あなたのファイルのすべての数字を4バイト、ビッグエンディアン、符号付き整数として読み込みます。numbersシーケンスが得られます。

ファイルが4バイトの倍数でない場合、最初の2つの方法で調整が必要な場合があります。whileの条件で十分です。

+0

OPは '[132、4、240、215]'を '0x8404f0d7'に変換したい、つまりビッグエンディアンが必要です。 –

+2

ファイルのサイズが4の倍数でない場合、最後のバイトにも注意してください... –

+0

ありがとう – jsbueno

関連する問題