二进制模板
帮助您理解二进制数据
编辑二进制数据是一项困难的工作。您需要精确知道文件中哪些字节需要编辑,编辑错误的字节可能导致文件不可用。二进制模板消除了二进制数据的神秘感,让您能够以强大且直观的方式理解数据并进行编辑。
右图展示了在 010 Editor 中打开的 ZIP 文件。大多数十六进制编辑器只显示文件的原始十六进制字节 (1),而 010 Editor 更进一步,将文件解析为便于编辑的层次化数据结构 (2)。该数据结构由一系列变量组成,在列表中选择一个变量会显示该变量对应的十六进制字节(在图中,变量 'frVersion' 对应十六进制字节 '14 00')。
010 Editor 可以在文件打开时自动应用二进制模板。010 Editor 内置了 ZIP、BMP 和 WAV 文件的二进制模板,还有大量其他模板可在我们的模板仓库中下载。如果您使用自己的二进制格式,编写自己的二进制模板并不困难。
编写二进制模板
二进制模板看起来类似于 C/C++ 中的结构体定义,但更加灵活——可以包含 if、for 或 while 语句,以及函数或复杂表达式。模板作为程序执行,从文件的第一行开始。每当声明一个变量,该变量就会映射到文件中的一组字节。然后可以通过访问创建的变量来读取或写入文件中的数据。关于模板工作原理的示例,请参见下一节。
010 Editor 完整支持二进制模板的编辑、运行和调试。内置了带有语法高亮的集成源代码编辑器(如左图所示)。
注意:一些其他编辑器提供了使用类似 C/C++ 结构体的结构查看器;但是,这些查看器远不如二进制模板强大,无法解析完整的二进制文件。
示例模板
以下示例演示了一个简单的二进制模板。该模板针对包含一系列员工记录的二进制文件设计。
当在模板中定义变量时,该变量会映射到文件中的一组字节。在此例中,变量 type 将映射到文件的前四个字节,version 映射到接下来的四个字节,numRecords 映射到接下来的两个字节,以此类推(参见下图)。执行模板时,任何已定义的变量都可以在声明后立即访问。此处 file.header.version 可以用于从文件中读取数据,即使 file 尚未完全定义。
模板非常灵活,可以包含复杂表达式,包括所有常规 C 运算符,如 +、-、*、/、&、|、^、~、%、++、--、?: 等。大量函数可用于修改模板的运行方式。请访问下方的模板下载查看更多模板示例。
编辑模板结果
模板运行后,在模板中定义的变量可以在十六进制编辑器下方显示的模板结果面板中访问,也可以在检查器的"变量"标签页中访问。模板结果显示了数据的完整层级视图(如左图所示)。
在列表中选择一个变量时,主十六进制编辑器窗口中对应的十六进制字节将被选中。可以通过点击"值"字段、输入新值并按 Enter 键来编辑变量。
要查找十六进制编辑器中某个字节位置对应的变量,请在十六进制编辑器中点击一个字节,然后按 Ctrl+J(跳转到模板变量)。010 Editor 将在模板结果中选择包含该字节的变量。
结构体轮廓线
从模板变量读取值的另一种方式是将鼠标光标定位在十六进制编辑器窗口中的某些字节上。如果这些字节属于模板结果中的某个结构体,将围绕该结构体绘制线条以指示变量的位置。这称为结构体轮廓线。同时还会显示一个提示弹窗,显示该位置变量的值。
使用脚本编辑
另一种编辑模板生成的变量的方法是使用脚本。脚本的语法类似于 C,以常规方式定义变量。例如,要将每个员工的薪水翻倍,可以使用以下脚本:
脚本可以自动修改模板中定义的任何变量。与其他编辑操作一样,脚本也支持撤消和重做。
高级特性
010 Editor 包含一些额外的功能,使模板更加强大:
- 使用 local 关键字在模板中定义常规 C 变量
- 为模板变量应用颜色,使其在编辑器中醒目显示
- 在模板中切换字节序,允许从同一文件中读取大端或小端数据
- 使用 FSeek 或 FTell 函数以任意顺序读取模板变量
- 通过编写特殊的读写函数定义自定义变量
- 使用 ReadByte、ReadShort、ReadInt 等函数从文件读取数据而无需声明变量
- 更改模板结果中显示的数据格式
- 支持结构体和联合体,可用于定义递归数据类型
- 使用按需结构体编写包含数百万变量的模板
- 可调用外部 DLL 中的函数
- 集成 X86、ARM、MIPS、PowerPC、SPARC、SystemZ 和 XCore 反汇编器
- 完整的模板和脚本调试器,包括断点、单步执行、监视和调用堆栈