私は、バイナリ ファイルを開き、頻繁に変化するバイナリ BLOB を見つけ、その BLOB だけを新しいファイルにコピーするための小さなスクリプトをプログラミングしています。
バイナリ ファイルのレイアウトは次のとおりです。
-JUNK (Unknown Size) (Unknown Contents)
-3-byte HEADER containing encoded size of blob
-PADDING (Unknown Size) (Every byte is FF in hex)
-Start of blob (72 bytes) (Unknown Contents)
-16 bytes that are ALWAYS the same
-End of blob (Size can be determined from subtracting (72+16) from value HEADER) (Unknown Contents)
-JUNK (Unknown Size) (Unknown Contents)
これまでに書いたコードは次のとおりです。
from sys import argv
import binascii
import base64
InputFileName = argv[1]
with open(InputFileName, 'rb') as InputFile:
Constant16 = base64.b64decode("GIhTSuBask6y60iLI2VwIg==")
Constant16Offset = InputFile.read().find(Constant16)
InputFile.seek(Constant16Offset)
InputFile.seek(-72,1)
InputFile.seek(-1,1)
FFTestVar = InputFile.read(1)
while FFTestVar == b'\xFF':
InputFile.seek(-2,1)
FFTestVar = InputFile.read(1)
InputFile.seek(-3,1)
BlobSizeBin = InputFile.read(3)
BlobSizeHex = binascii.b2a_hex(BlobSizeBin)
BlobSizeDec = int(BlobSizeHex, 16)
InputFile.seek(Constant16Offset)
InputFile.seek(-72,1)
Blob = InputFile.read(BlobSizeDec)
with open('output.bin', 'wb') as OutputFile:
OutputFile.write(Blob)
残念ながら、whileループは遅いです。InputFile は最大 24MB の大きさになる可能性があり、パディングはその巨大なチャンクになる可能性があります。一度に 1 バイトずつ処理するのはとてつもなく遅いです。
おそらくこれを行うためのより良い方法があると思いますが、1、2 時間のグーグル検索は役に立ちませんでした。
ありがとう!