昨天,Shing Liu要求我帮忙写一个对Aveva Rvm 二进制格式的解析程序。我粗看了下格式还是比较简单的,没有涉及到压缩、加密。下面给出简要分析过程,希望对有需要的朋友有所帮助。这是我第一次写blog,写的不到之处请谅解。
为了便于后面查看,我先在此放出Text与Binary的对照图:
1. 基本格式
基本格式是以节的方式存储,节与节之间紧密相邻。每一节包含节名称(Section Name)、下一个节地址(Next Section Addr)、节内容(Section Content),如下表所示。
Section Name | Next Section Addr | Section Content | Section Name | Next Section Addr | Section Content | ...... |
16 bytes | 4bytes | N bytes | 16 bytes | 4bytes | N bytes | ...... |
节与节之际的关系请注意红色箭头(^ ^)
2. 详细分析
2.1 Section Name
所占大小为16字节,如下图所示,左边为十六进制,右边为相应的ASCII编码。
可以看出名称与Rvm Text版本的”HEAD”基本一致,只是其中用了几个0填充了下,当然,这也便于我们区分文件是二进格式的还是文本格式的。
2.2 Next Section Addr
所占大小为4字节(以大端法表示),如下图,其中C4就是下一节开始的地址。
我们可以看一下C4处的内容,如下图,可以看出下一节的名称就是Text中对应的”MODL”。
2.3 Section Content
所占的字节视实际情况而定。
所有节的内容起始的八个字节均为00 00 00 01 00 00 00 01,猜测是用于表明这是一个节,且便于调试等。
类型主要有以下几种
1)字符串
可以看出00000014表示后续字符串大小(4字节为一个单位),所以,这里表示后面紧跟80字节的字符串。
2)整型
整型出现的地方主要包括Next Section Addr、字符串长度、几何信息等等。且都是以大端法表示的。
3)浮点数
浮点数也是以大端法形式表现的,如下图。在intel的cpu上需要位操作处理下。当然,也可以使用ntohl。
3. 解析结果
此解析算法在RvmTranslator程序中实现,经验证有效。转换结果见下图:
程序的使用及下载见:http://www.cppblog.com/eryar/archive/2015/04/22/210424.html