我有一个大约60kb的文件,我只想提取数据。该文件中有很多"FF FF“,我正在尝试提取除"FF FF”之外的所有内容,下面是一个示例:
46 0D 89 2E 16 FC 1E E6 10 C1 6D 4E 1B 74 5F 1F
81 07 E2 E7 17 14 77 D4 EA AC BC 20 EA 98 27 FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF下面是我用来获取它的代码:
infile = open("file.bin", "rb")
new_pos = int("0xFC0000", 16)
infile.seek(new_pos, 0)
chunk = int("0x40000", 16)
data = infile.read(chunk)
with open("processed_file.bin", "wb") as outfile:
outfile.write(data)它将读取文件并将其保存为"processed file.bin“,但其中包含所有这些"FF FF”。有FF的实例,我需要它找到"FF FF“并将其从文件中删除,然后将其保存为已处理的file.bin
任何意见都将不胜感激。
编辑:为了进一步解释我的意思,这个十六进制的末尾有FF,
81 07 E2 E7 17 14 77 D4 EA AC BC 20 EA 98 27 FF我需要将FF保留在末尾,但删除FF FF或FF FF的所有实例。
发布于 2013-01-29 09:43:10
首先,删除每个FF FF显然就是删除每个FF FF FF FF,所以您不需要担心这一部分。
如果您只想删除对齐的FF FF,最明显的做法是将其分组为2字节的块。例如,在标准库的itertools recipes之外使用grouper
data = infile.read(chunk)
data_words = grouper(2, data)
data_words_minus_ffff = (word for word in data_words if word != ('\xFF', '\xFF'))
out_data = flatten(data_words_minus_ffff)
with open("processed_file.bin", "wb") as outfile:
outfile.write(''.join(out_data))显然,您可以编写得更简洁;我这样做只是为了清晰(因此,您可以尝试在每个步骤中打印出list(…),以帮助理解它,以防它不明显)。
但是,如果您不关心对齐,甚至想要删除FF的奇怪运行,只要它们的长度大于1,该怎么办?嗯,然后你想把它分组到运行中,然后丢弃任何超过1的运行。你也可以用itertools做到这一点:
data = infile.read(chunk)
groups = itertools.groupby(data, key=lambda x: x != '\xff')
groups_listified = ((key, list(group)) for key, group in groups)
groups_without_ff_runs = (group for key, group in groups_listified if key or len(group) > 1)
out_data = flatten(groups_without_ff_runs)
with open("processed_file.bin", "wb") as outfile:
outfile.write(''.join(out_data))这一步有点难解释,但我还是把它写成了一系列独立的步骤,所以你可以在每一步之后用print list(…)查看它在做什么。
if key or len(group) > 1位表示它是非FF字节的游程,或者是超过1个字节的游程。因此,如果您想要将其更改为仅保持2字节FF运行,而不是更长的运行,您可以将len(group) > 1更改为len(group) == 2。如果您只想保持均匀长度的运行,请使用len(group) % 2 == 0。诸若此类。任何你能描述的条件,你都可以放在那里。
或者,为了多样化起见,让我们显式地这样做:
data = infile.read(chunk)
run = 0
out_data = []
for byte in data:
if byte == '\xFF':
run += 1
else:
if run != 1:
out_data.append('\xFF' * run)
run = 0
out_data.append(byte)
with open("processed_file.bin", "wb") as outfile:
outfile.write(''.join(out_data))同样,我们保留了所有长度超过1字节的FF运行。如果你想保留所有2字节的游程,只需将run != 1改为run == 2即可。诸若此类。
https://stackoverflow.com/questions/14574210
复制相似问题