gpt4 book ai didi

python - 在Python中查找不等于不需要的字节的前一个字节

转载 作者:行者123 更新时间:2023-12-01 05:52:54 25 4
gpt4 key购买 nike

我正在编写一个小脚本,用于打开一个二进制文件,找到一个经常更改的二进制 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,而填充可能会占其中的很大一部分。一次浏览一个字节是非常慢的。

我认为可能有更好的方法来做到这一点,但是一两个小时的谷歌搜索并没有帮助。

谢谢!

最佳答案

您可以将整个文件读入内存(您实际上这样做了):

data = InputFile.read()

然后你可以将data当作随意的字符串(但它不是unicode字符串,而是一个字节数组,不幸的是在python 2.X下被称为str)。您需要记住偏移量,因此我们将创建 offset 属性。每行看起来像 InputFile.seek(xx) 的行都必须转换为 offset = xx 并将 InputFile.seek(xx, 1) 转换为 偏移+=xx

magic_number = base64.b64decode("GIhTSuBask6y60iLI2VwIg==")
offset = magic_number_offset = data.find(magic_number)
offset -= 72

然后,使用 re 模块代替 while 循环(您需要导入该模块):

pattern = re.compile("[^\xFF]\xFF*$")
offset = pattern.search(data, endpos=offset).start() + 1

其余代码是:

offset -= 3
blob_size_bin = data[offset:offset+3]
blob_size_hex = binascii.b2a_hex(blob_size_bin)
blob_size_dec = int(blob_size_hex, 16)
offset = magic_number_offset - 72
blob = data[offset:offset+blob_size_dec]

如果文件很大并且Python进程消耗大量内存,您可以使用mmap模块而不是将整个文件加载到内存中。

如果此解决方案仍然很慢,您可以反转数据顺序 (reversed_data = data[::-1]) 并搜索模式[^\ff].

关于python - 在Python中查找不等于不需要的字节的前一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13560349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com