模板是个好东西,可以直观地展现出文件结构,便于分析文件。
平时用的不多,但要写的时候又总忘记,所以在此记录一下。
模板文件
模板文件扩展名为.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 { |