当有人评论说不可能转储“ .blend
”文件的内容时,我开始为“ .blend
”文件编写一个解析器;-)
到目前为止,我可以解析所有文件块和 SDNA 。但是,当要把文件块的数据读到相应的结构字段中时,我遇到了一个我真的不知道如何解决的问题(由于缺少适当的文档):
如果结构的第 n 个字段的类型索引为 i ,如何确定类型 i 是否为结构递归还是简单类型?
例如FileGlobal
有一个字段short subversion
,其中short
的类型索引为2。显然,short
不是复合结构,但解析器如何确定?
在我解析器的SDNA中,STRC
的索引2是ListBase
,而TYPE
的索引2是short
。显然,类型索引在两个表中都有效,但是含义不同...
那么我的解析器错了吗,或者诀窍是什么?作为参考,以下是我看到的SDNA的一些详细信息:
file-header: BLENDER version 279 little-endian 64-bit ptr
...
file-block: code DNA1 size 90700 addr 55b81c6e7c80 SDNA 0 count 1
SDNA: names 4291
SDNA: NAME #0=*next
SDNA: NAME #1=*prev
SDNA: NAME #2=*data
...
SDNA: types 706
SDNA: TYPE #0=char
SDNA: TYPE #1=uchar
SDNA: TYPE #2=short
...
SDNA: TLEN #0=1
SDNA: TLEN #1=1
SDNA: TLEN #2=2
...
SDNA: structures 621
SDNA: STRC #0=stype 12 nfields 2
...
SDNA: STRC #2=stype 14 nfields 2
SDNA: STRC field #0=ftype 11 name 3
SDNA: STRC field #1=ftype 11 name 4
...
见解?
答案 0 :(得分:-1)
由于目前还没有答案,我正在逐个回答我的问题(据我所知):
首先,文件块中给出的SDNA
索引似乎是STRC
表中类型的索引。但是,索引为0的类型的类型编号为12。该固定偏移量(12)一直持续到索引12,该类型为26。因此,实际上您需要另一个表(倒排索引< / em>),将类型编号与STRC
表中类型的索引匹配。
由于该表中的第一个类型编号为12,因此似乎前十二个类型编号用于以下原始类型:char
,uchar
,short
,{{1} },ushort
,int
,long
,ulong
,float
,double
,int64_t
,uint64_t
< / p>
但是void
中不存在这些类型。因此,类型2没有出现在倒排索引中,因此它必须是原始(非复合)类型。
不幸的是,上述规则似乎有例外:STRC
中的字段类型不是(例如SDNA索引)索引到STRC
的索引,而是< em> type number ,因此您需要在此处使用倒排索引。使用递归例程进行解码时(例如我),例程必须知道是处理“ 类型索引”还是处理“ 类型编号”。