模板是个好东西,可以直观地展现出文件结构,便于分析文件。
平时用的不多,但要写的时候又总忘记,所以在此记录一下。
#模板文件
模板文件扩展名为.bt,是一个文本文件,可以自己创建一个.txt文件修改为.bt,或者通过点击菜单Templates > New Template来创建。
一个简单的例子
1 | //------------------------------------------------ |
文件最开始若干行用//注释的元信息,用于描述模板文件及如何匹配魔术数,都是可选的,可以不填写,但是强烈建议填写File Mask和ID Bytes。

程序会优先用File Mask匹配文件扩展名,再用ID Bytes匹配魔术数,匹配成功的话就会自动加载模板文件。
当然,如果你不需要自动加载模板文件这个功能的话就可以不写,通过菜单手动加载模板。
如果文件可能有多种扩展名,就用逗号分隔,比如*.txt,*.xml。
ID Bytes也是一样,比如ID Bytes: BE, 56 31 4D 4D 57 58。
#语法
模板是从上到下运行的,我们的主要工作就是定义各种数据结构、控制流程等等。
因为编写模板和开发C语言程序几乎差不多,所以我只讲一些常见的需要注意的地方。
#本地变量
默认情况下,所有变量都会显示在模板窗口中。比如我定义了一个int x;

可以通过local关键字定义变量,这样的变量默认不会显示在模板窗口中,不过用户任然可以在窗口中点击右键菜单中的Show Local Variables来显示局部变量。
Local Variables
#大小端
默认随系统,比如在 Windows 下是按照小端模式,通过BigEndian和LittleEndian来调整读取方式。
1 | BigEndian(); // 转换为大端模式 |
更多内置函数查看官方手册:I/O Functions
#停止执行脚本
如果在执行过程中发现脚本结构不对时可以提前结束,使用return语句即可
1 | local string magic = ReadString(0, 5); |
我们把整个脚本文件看作是一个C函数,用return就可以提前退出函数。
#结构体构造函数
这样是合法的
1 | typedef struct (uint offset) { |
使用方法
1 | FILE f(123); |
#结构体中可以有表达式
有时候结构体不是固定长度,而是根据字段的值来决定的
1 | typedef struct { |