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

16

我想能够打开图像文件并逐字节提取十六进制值,但我不知道如何操作。在谷歌搜索“python byte editing”和“python byte array”没有找到任何有用的结果,让我感到意外。请问有人可以指出我需要使用哪个库,可以搜索哪些具体方法,或者有哪些教程/指南吗?


这是您想以编程方式完成的吗?还是您正在寻找十六进制编辑器? - David Z
@david:我认为我想以编程的方式完成这个任务。在我的自定义图像文件中,有7个维度来定义每个像素点,并通过在所有7个维度上递增将它们组织在一个块中。我想撤销这个操作,将所有7个维度分开,并重新组合它们,使其符合图像的TIF文件规范。我认为最好以编程的方式完成这个任务,是吧? - Tony Stark
我会通过PIL库来处理TIFF部分。 - Nelson
@nelson:为什么?PIL库提供了什么功能可以使这更容易? - Tony Stark
4个回答

13

Python标准库有mmap模块,可以用来实现这一点。请查看 文档 以获取更多信息。


2
+1。通常我会像sth的回答一样将文件加载到内存中进行编辑,但如果文件可能非常长,则使用mmap更好。当然,如果文件非常非常长且无法适应您的地址空间,则需要返回open(path,'r + b')和seek()... - bobince
@bobince:在您看来,一个文件在什么时候会“太长”,需要采用sth的答案并转向mmap? - Tony Stark
@hatorade:标准的打开/读取/关闭可以处理大小达到可用内存的文件,但是使用mmap()会看到性能的提高,因为只有你修改的页面才会从磁盘中读取。我估计当文件达到1兆字节左右时,性能差异会非常明显。 - John Millikin

11

根据你想做什么,可能只需要以二进制模式打开文件,然后使用普通的文件函数读取数据:

# 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规格重新组织它。 - Tony Stark
我想知道是否可以使用上述方法删除标题。 - Angelo

5

Hachoir框架

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

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

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


1

请查看stuct模块。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接