Python - 如何逐字节编辑十六进制文件

Posted

技术标签:

【中文标题】Python - 如何逐字节编辑十六进制文件【英文标题】:Python - How to edit hexadecimal file byte by byte 【发布时间】:2010-11-22 06:59:59 【问题描述】:

我希望能够打开一个图像文件并逐字节添加十六进制值。我不知道如何做到这一点,令人惊讶的是,谷歌搜索“python 字节编辑”和“python 字节数组”并没有提出任何建议。有人可以指出我需要使用的库、我可以用谷歌搜索的具体方法或教程/指南吗?

【问题讨论】:

这是您想以编程方式执行的操作吗?还是您在寻找十六进制编辑器? @david:我想我想以编程方式进行。在我的自定义图像文件中,有 7 个维度定义了每个像素,并且它们通过基本上在所有 7 个维度中递增来组织成一个块。我想撤销它,分离所有 7 个维度,然后重新组合它们,使它们符合图像的 TIF 文件规范。我认为最好以编程方式完成,是吗? 我会通过 PIL 库完成 TIFF 部分。 @nelson:为什么? PIL 库提供了什么可以让这变得更容易? 【参考方案1】:

Hachoir 框架是一组用于解析和编辑二进制文件的 Python 库和工具:

http://pypi.python.org/pypi/hachoir-core

它了解常见的文件类型,所以这可能正是您所需要的。

【讨论】:

【参考方案2】:

Python 标准库有 mmap 模块,它可以用来做这个。查看the documentation 了解更多信息。

【讨论】:

+1。通常我会将文件加载到内存中进行编辑,就像在某事的答案中一样,但是如果文件可能很长,那么 mmap 会更好。当然,如果文件非常非常长并且不适合您的地址空间,它会返回到 open(path, 'r+b') 和 seek()... @bobince:在您看来,文件在什么时候会“太长”而无法与某事的答案相匹配并转移到 mmap 上? @hatorade:标准的打开/读取/关闭可以处理与可用内存一样大的文件,但是使用 mmap() 您会看到性能改进,因为只有您修改的页面才会从磁盘读取。我估计当文件达到 1 MB 左右时,显着的性能差异会很明显。【参考方案3】:

根据您想要做什么,open the file in binary mode 并使用普通的file 函数读取数据可能就足够了:

# load it
with open("somefile", 'rb') as f:
    data = f.read()

# do something with data
data.reverse()

# save it
with open("somefile.new", 'wb') as f:
    f.write(data)

Python 并不真正关心data 字符串是否包含“二进制”或“文本”数据。如果您只想对合理大小的文件进行简单修改,这可能就足够了。

【讨论】:

是的,我只是想打开一个自定义图像文件并将其转换为 .tiff。这可能是诀窍,因为我基本上是在“撤消”用于在自定义图像文件中分配像素数据并根据 .tif 规范重新组织它的算法 我想知道我是否可以使用上面提到的删除标题【参考方案4】:

查看stuct 模块。

此模块执行 Python 值和表示为 Python 字符串的 C 结构之间的转换。它使用格式字符串(如下所述)作为 C 结构布局的紧凑描述以及与 Python 值的预期转换。这可用于处理存储在文件中或来自网络连接以及其他来源的二进制数据。

【讨论】:

以上是关于Python - 如何逐字节编辑十六进制文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 3 中将原始十六进制字节写入标准输出?

Python:如何将包含十六进制字节的字符串转换为十六进制字符串

十六进制编辑器--ImHex

如何在 Python 中从十六进制(字节字符串)中读取单个字符?

十六进制打印中的零跳过

Python:如何比较两个二进制文件?