fast协议 fix

总体

fast
fast

原始fix消息

原始fix消息

字段编码操作

字段编码操作

fast消息模版和隐藏tag 消息

fast消息模版和隐藏tag 消息
  • 注意少一个tag为268,因为268表示的是个数

含有操作符的消息模版和字段编码消息

含有操作符的消息模版和字段编码消息

fast消息序列化

fast消息序列化

二进制连续为编码:

二进制连续为编码

停止位编码实体

停止位编码实体

presence map(PMAP 存在图)

A presence map enables use of default values;Bit map which indicates the presence or absence of fields in the message. Fields which are null due to having been “copied away” can be represented by a bit in the presence map indicating that the field is absent.presence Map是一组bits位。模版中的各field根据操作符的不同,通过presence Map标识是否出现在fast数据流中。

 public void testEncodeMessageWithSignedIntegerFieldTypesAndAllOperators() {
        MessageTemplate template = new MessageTemplate("",
                new Field[] {
                    new Scalar("1", Type.I32, Operator.COPY, ScalarValue.UNDEFINED, false),
                    new Scalar("2", Type.I32, Operator.DELTA, ScalarValue.UNDEFINED, false),
                    new Scalar("3", Type.I32, Operator.INCREMENT, new IntegerValue(10), false),
                    new Scalar("4", Type.I32, Operator.INCREMENT, ScalarValue.UNDEFINED, false),
                    new Scalar("5", Type.I32, Operator.CONSTANT, new IntegerValue(1), false), /* NON-TRANSFERRABLE */
                    new Scalar("6", Type.I32, Operator.DEFAULT, new IntegerValue(2), false),
                    new Scalar("7", Type.I32, Operator.CONSTANT, new IntegerValue(1), false),/* NON-TRANSFERRABLE */
                    new Scalar("8", Type.I32, Operator.CONSTANT, new IntegerValue(1), false),/* NON-TRANSFERRABLE */
                    new Scalar("9", Type.I32, Operator.COPY, ScalarValue.UNDEFINED, false)
                    
                    
                });
        Context context = new Context();
        context.registerTemplate(113, template);

        FastEncoder encoder = new FastEncoder(context);

        Message message = new Message(template);
        message.setInteger(1, 109);
        message.setInteger(2, 29470);
        message.setInteger(3, 10);
        message.setInteger(4, 3);
        message.setInteger(5, 1);
        message.setInteger(6, 2);
        message.setInteger(7, 1);
        message.setInteger(8, 1);
        message.setInteger(9, 2);

        //             --PMAP-- --TID--- --------#1------- ------------#2------------ ---#4--- ---#9----
        String msg1 = "11101010 11110001 00000000 11101101 00000001 01100110 10011110 10000011 10000010";
        TestUtil.assertBitVectorEquals(msg1, encoder.encode(message));

我们首先分析这9个field一共使用了多少个bit位,
  (1)第1个field,强制的COPY,占用位;
  (2)第2个field,强制的delta,不用占位;
  (3)第3个field,强制的increment,占用位;
  (4)第4个field,强制的field,占用1位;
  (5)第5个field,强制的constant,不占位;
  (6)强制的default,占用位;
  (7)第7、8个field,强制的constant,不占位;
  (8)第9个field,强制的copy,占用位。一共9个field,4个field不占位,所以用5个bit就可以标识,因此,Presence Map一个byte就足够标识。
  分析encoding之后的二进制字符串。“11101010”去掉Stop bit,剩余1101010,1101010为模板存在标记,1101010为第一个field存在标记,1101010,第3个field的值不在fast数据流中,1101010,第4个field的值在数据流中,1101010,第6个field的值不在数据流中,1101010,第9个field的值在数据流中。
  再分析PMAP之后的各数据,第一个为模板值,11110001去掉Stop bit为1110001=113;接着为第1个field的值,00000000 11101101 = 1101101 =109;接着为第2个field的值,00000001 01100110 10011110 = 29470,;接着为第4个field的值,10000011 = 3;接着为第9个field的值,10000010 = 2。

例子

在传输的过程:对于消息的压缩处理,主要采用pmap+field segment方式,其中:pmap标记了该消息中包含了那些字段,而field segment则是各自段具体的压缩数据。
压缩算法:
首先生成pmap,然后再加入数据。(pmap之后,通常增加了模版ID字段值,再加入其它定义的数据字段值)。
对于数据的压缩算法,采用了Stop bits encoding方式,每个字节的最高位,标志了消息中该字段是否结束(0标识没有结束,1标识结束,对于数据的存储,按照7bit进行划分)。
样例:
假设我们要对于58=HelloWorld进行FAST压缩,假设该消息对应的模版ID为1.
1.生成PMAP,压缩后的消息包含了两个字段,模版ID和58field对应的消息内容(helloworld);
可以用1个byte标志消息中出现的字段,110 0000,最高为置为1,标志结束;则第一个byte为1110 0000 = 0xE0;
2.下一个field为模版ID, ID为1, 000 0001,最高为置为1,标志结束;则第二个byte为1000 00001 = 0x81;
3.下一个字段为58field对应的消息,hello world,对应的16进制表示为:
H=0x48, e=0x65, l=0x6C, l=0x6C, o=0x6F, W=0x57, o=0x6F, r=0x72, l=0x6C, d=0x64.二进制为:
1001000 1100101 1101100 1101100 1101111 1010111 1101111 1110010 1101100 1100100。
此时,需要通过最高为置1标志字段数据的结束;即:
01001000 01100101 01101100 01101100 01101111 01010111 01101111 01110010 01101100 11100100
以上为基本的压缩方式。

参考

  1. http://blog.sina.com.cn/s/blog_735f29100101d0sh.html
  2. http://www.financecomputing.net/wordpress/?tag=fixfast
  3. http://www.fixprotocol.org/fastspec
  4. http://www.openfast.org/
  5. 例子程序openfast:https://www.wenji8.com/p/7b9BlPI.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,401评论 19 139
  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,597评论 1 24
  • 我的信念是:没有时间跑步,就会有时间生病;没时间学习跑步,就会有时间受伤!跑步是一种容易学会的技能,不需要痛苦地坚...
    lanjing阅读 595评论 0 1
  • 已是人间四月天。花开正艳,杨柳依依,春风拂面,暖阳肆意。冰冷的冬天似乎已经远离我们而去…… 然而,忽然狂风大作,吹...
    Aylin楚吟阅读 427评论 6 19
  • -(id) performSelector: selector 调用选择器方法 -(BOOL) isKindOfC...
    沙瓦迪卡阅读 405评论 0 1

友情链接更多精彩内容