基于变量输入在010 Editor中计算偏移值的技术求助
010 Editor模板问题:计算Pointer与Material的长度
我正在逆向一个已解析完头部和条目列表的文件,目前编写的010 Editor模板代码如下:
struct FILE { struct HEADER { uint32 entryNum; // 条目数量 uint32 entryFilepathNum; uint32 entryListLength; } header <bgcolor=0xA4F263>; struct LIST { uint32 offsetPointer; // Pointer的偏移(从最后一个LIST条目结束位置开始计算) uint32 offsetMaterial; // 对应Material的偏移(从最后一个Pointer条目结束位置开始计算) } list[file.header.entryNum[0]] <bgcolor=0x8D52CC>; } file;
现在需要根据自身偏移和下一个元素的偏移,计算每个Pointer和Material的长度,但在此步骤遇到阻碍。对应的十六进制数据片段如下:
// 头部区域 02 00 00 00 // entryNum = 2 02 00 00 00 // entryFilepathNum = 2 10 00 00 00 // entryListLength = 16 // 条目列表区域 10 00 00 00 // 第一个LIST.offsetPointer 20 00 00 00 // 第一个LIST.offsetMaterial 20 00 00 00 // 第二个LIST.offsetPointer 30 00 00 00 // 第二个LIST.offsetMaterial // 后续Pointer与Material内容 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 61 62 63 64 65 66 67 68 69 6A
解决方法
可以通过在模板中添加计算字段,并遍历条目来实现长度计算,修改后的模板代码如下:
struct FILE { struct HEADER { uint32 entryNum; uint32 entryFilepathNum; uint32 entryListLength; } header <bgcolor=0xA4F263>; struct LIST { uint32 offsetPointer; uint32 offsetMaterial; // 存储计算出的Pointer长度 uint32 pointerLength <read=0>; // 存储计算出的Material长度 uint32 materialLength <read=0>; } list[file.header.entryNum] <bgcolor=0x8D52CC>; } file; // 遍历所有条目,计算Pointer和Material的长度 for (int i = 0; i < file.header.entryNum; i++) { // 计算Pointer长度:非最后一个条目用下一条的Pointer偏移减当前,最后一条用自身Material偏移减当前Pointer偏移 file.list[i].pointerLength = (i < file.header.entryNum - 1) ? file.list[i+1].offsetPointer - file.list[i].offsetPointer : file.list[i].offsetMaterial - file.list[i].offsetPointer; // 计算Material长度:非最后一个条目用下一条的Material偏移减当前,最后一条用文件总长度减当前Material偏移 file.list[i].materialLength = (i < file.header.entryNum - 1) ? file.list[i+1].offsetMaterial - file.list[i].offsetMaterial : FileSize() - file.list[i].offsetMaterial; }
说明
- 对于非末尾的条目,利用相邻条目的偏移差值直接得到当前Pointer/Material的长度,因为下一个条目的起始偏移就是当前内容的结束位置。
- 对于最后一个条目,Pointer的结束位置是自身Material的起始偏移,Material的结束位置则是文件末尾,以此计算长度。
内容的提问来源于stack exchange,提问作者user28805212
相关产品推荐
相关产品推荐

