【发布时间】:2018-08-30 10:01:18
【问题描述】:
我有一个 二进制 文件,我需要在其中更改某些位。
该位的字节地址是相对于某个字节序列(某个 ASCII 字符串)的:
content = array('B')
with open(filename, mode="r+b") as file:
content.fromfile(file, os.fstat(file.fileno()).st_size)
abc = [ord(letter) for letter in "ABC"]
i = content.index(abc) // ValueError: array.index(x): x not in list
content[i + 0x16] |= 1
content.tofile(file)
但是我必须承认我的耻辱,在谷歌搜索之后,我找不到获取“ABC”字符串索引的方法......
当然,我可以编写一个使用循环执行此操作的函数,但我不敢相信没有单行(好吧,甚至两个...)可以完成它。
怎么做?
【问题讨论】:
-
您的“尽可能高效”的需求没有得到很好的约束。如果速度是唯一的问题,你为什么还要使用 Python 而不是 C 或汇编?
-
@timgeb,我删除了该约束。这不是这里的主要问题。但是,如果您坚持要一个答案,那么它是一个构建脚本,它必须保持一个脚本,而不是编译代码,并且还有许多其他文件需要更改,同时确保构建不会变得太慢。基本上我只是想避免使用不可变序列,我想就地更改数据。
-
不用担心。 “尽可能高效”的问题在于,您可能会得到非pythonic 的答案,这会牺牲很多纳秒的可读性。相反,请尝试以更严格的方式描述所需的效率水平。
-
"ABC".encode(hex)的预期用途是什么?它是一种 Python 2 方法,在 2012 年被称为 not nice ... 无论如何:因为它会将ABC转换为414243,你是否确定文本414243应该出现在里面的某个地方你的二进制文件?还是我在这里误解了它的目的? -
@usr2564301,是的,这就是问题所在,
414243不是作为字符串出现,而是作为字节序列出现,这意味着在文件的某个地方有一个[0x41, 0x42, 0x43]的序列,我不知道如何:1:从字符串生成该序列,以及 2:如何在文件内容中定位该字节序列。我可以用abc = [ord(letter) for letter in "ABC"]解决问题#1,但是#2 仍然失败。
标签: python