fix/fast协议中PMAP(存在图)和Sequence的解析要点
吴旻
泰岩网络工作室
因为升级的原因,我整理了一个从前的兄弟写的FIX/FAST解析代码。其中一直让我看不懂的是PMAP和Sequence的解法(因为代码事实上是有问题的),我也没找到相关的文档。下载了Quickfast的安装包,费了牛劲安装好,发现更复杂。好在只用到了一点点,算是把这两件事弄明白了。
PMAP可能没有。
这是一个致命的陷阱。一个正常的消息第一个数据就是PMAP,而且这个PMAP的第一个bit就是指后面有没有此消息的TID。正常的消息一定会有PMAP。
但对于Sequence来说,它后面的第一个数据是这个Sequence的长度。再下一个数据可能是PMAP,也可能是正式的数据。有还是没有,判断错了,后面就全错了。
由于找不到相关的文档,只好查Quickfast的代码。Quickfast的代码显示,有没有PMAP是根据这个template中所有的filed是不是可能用到PMAP有关。如果说,这个template中所有的字段都不需要使用PMAP就能判断出来,那就不会有PMAP出现。比如下面的例子:
<sequence name="BidPriceLevel"presence="optional">
<lengthname="NoBidPriceLevel" id="10068"presence="optional"/>
<int64name="BidSize" id="134"/>
<int32name="BidPx" id="132" decimalPlaces="3"/>
</sequence>
因为Sequence里的field操作符是None,所以这个Sequence就不会有PMAP。有还是没有,是在加载模板后,就要算出来的。
Sequence的长度显式和隐式表示法。
上面的例子中,Sequence下的第一个field指的是全部Sequence的个数,只需要读取一次就够了。千万别把它当成是Sequence中的field。另一种隐式的写法也许更理一些,如下:
<sequence id="73" presence="optional"name="Orders">
<uInt32 id="38" presence="mandatory"name="OrderQty" />
</sequence>
FAST模板是个自相似的结构。
自相似是分形的另一个表述,就是整体和局部非常像,单独拿出来,你分不清哪是整体,哪是局部。这个用函数表述就是递归,一层一层调用,但调用的是同一个函数。quickfast用几十个类去解析,我只用了3个类就做完了。
fix/fast协议中PMAP(存在图)和Sequence的解析要点