首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用python忽略"FF FF“

如何使用python忽略"FF FF“
EN

Stack Overflow用户
提问于 2013-01-29 09:27:48
回答 1查看 338关注 0票数 0

我有一个大约60kb的文件,我只想提取数据。该文件中有很多"FF FF“,我正在尝试提取除"FF FF”之外的所有内容,下面是一个示例:

代码语言:javascript
复制
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

下面是我用来获取它的代码:

代码语言:javascript
复制
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,

代码语言:javascript
复制
81 07 E2 E7 17 14 77 D4 EA AC BC 20 EA 98 27 FF

我需要将FF保留在末尾,但删除FF FF或FF FF的所有实例。

EN

回答 1

Stack Overflow用户

发布于 2013-01-29 09:43:10

首先,删除每个FF FF显然就是删除每个FF FF FF FF,所以您不需要担心这一部分。

如果您只想删除对齐的FF FF,最明显的做法是将其分组为2字节的块。例如,在标准库的itertools recipes之外使用grouper

代码语言:javascript
复制
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做到这一点:

代码语言:javascript
复制
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。诸若此类。任何你能描述的条件,你都可以放在那里。

或者,为了多样化起见,让我们显式地这样做:

代码语言:javascript
复制
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即可。诸若此类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14574210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档