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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

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