首页 > 其他分享 >FAST协议详解4 存在图PMap

FAST协议详解4 存在图PMap

时间:2023-10-24 14:02:18浏览次数:51  
标签:123 模版 FAST 传输 详解 操作符 PMap ID

一、概述

存在图是比较基础但又非常重要的一个设定,如果存在图没搞对后面的解析肯定是有问题的。但要说清楚存在图又必须先搞明白各种数据类型、操作符、可空属性,所以存在图虽然在FAST数据流的最前面但又不得不放到最后来说。

 

二、存在图的基本设定

存在图主要与操作符类型强相关,但又与可空属性和数据类型有一点关系,这里我们以操作符作为主索引,依次进行实例演示。

操作符

可空属性

PMap

说明

DEFAULT默认

False/True

占1位

字段使用DEFAULT操作符后,在PMap中将占用1位用以表示是否有传输该字段值。若PMap中该位值为0,表明未传递值,则该字段解析结果为“默认值”。若PMap中该位值为1,表明有传递值,则该字段解析结果以传递值为准。

COPY复制

False/True

占1位

字符使用COPY操作符后,在PMap中将占用1位用以表示是否有传输该字段值。若PMap中该位值为0,表明未传递值,则该字段解析结果为“上一次传输的值--即复制”。若PMap中该位值为1,表明有传递值,则该字段解析结果以传递值为准。

INCREMENT递增

False/True

占1位

字符使用INCREMENT操作符后,在PMap中将占用1位用以表示是否有传输该字段值。若PMap中该位值为0,表明未传递值,则该字段解析结果为“上一次传输的值+1”。若PMap中该位值为1,表明有传递值,则该字段解析结果以传递值为准。

TAIL接尾

False/True

占1位

字符使用TAIL操作符后,在PMap中将占用1位用以表示是否有传输该字段值。若PMap中该位值为0,表明未传递值,则该字段解析结果为“上一次传输的值”。若PMap中该位值为1,表明有传递值,则该字段解析结果为上一次传输值+接尾部分。

CONSTANT常量

False

不占位

字段使用CONSTANT操作符且可空属性为False时,在PMap中不占位。编码时无论该字段是否有设置值,流中均不传输任何值,解析方只根据预设的常量值解析。

CONSTANT常量

True

占1位

字段使用CONSTANT操作符且可空属性为True时,在PMap中占1位。编码时若该字段有设置值,则PMap中该位值为1,表明字段不为空,应解析为预设值。编码时若该字段未设置值,则PMap中该位值为0,表明字段为空,应解析为null。

NONE无

False/True

不占位

字段使用NONE操作符时,在PMap中不占位。即FAST流中一定会传输该字段值。

 

三、实例

1、DEFAULT默认操作符

操作符

可空属性

PMap

说明

DEFAULT默认

False/True

占1位

字段使用DEFAULT操作符后,在PMap中将占用1位用以表示是否有传输该字段值。若PMap中该位值为0,表明未传递值,则该字段解析结果为“默认值”。若PMap中该位值为1,表明有传递值,则该字段解析结果以传递值为准。

 

FAST协议详解4 存在图PMap_模版

上述代码运行结果如下:

msg111= -> {123, 1}

msg111= -> {123, 2}

msg111= -> {123, 3}

outByteStr=11100000,11111011,10000001,10000000,10100000,10000011,

二进制数据解析如下:

提前说明:需要注意模版ID字段在PMap中须占1位,根据“二、存在图的基本设定”,这里数据字段在PMap中须占1位。

二进制数

解码结果

说明

11100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明有传输该字段

第三位是数据字段,这里表明有传输该字段

11111011

123

根据PMap得知有传输模版ID字段,故模版ID=123

10000001

1

根据PMap得知有传输数据字段,故数据字段=1

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明未传输该字段,根据字段属性,数据字段的值应该=2(默认值)

10100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明传输了数据字段

10000011

3

根据PMap得知有传输数据字段,故数据字段=3

 

问题:将可空属性修改为true如何

FAST协议详解4 存在图PMap_操作符_02

上述代码运行结果如下:

msg111= -> {123, 1}

msg111= -> {123, 2}

msg111= -> {123, null}

outByteStr=11100000,11111011,10000010,10000000,10100000,10000000,

二进制数据解析如下:

二进制数

解码结果

说明

11100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明有传输该字段

第三位是数据字段,这里表明有传输该字段

11111011

123

根据PMap得知有传输模版ID字段,故模版ID=123

10000010

1

注:由于字段是可空的,所以需要自减1

根据PMap得知有传输数据字段,故数据字段=1

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明未传输该字段,根据字段属性,数据字段的值应该=2(默认值)

10100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明传输了数据字段

10000000

Null

根据PMap得知有传输数据字段,故数据字段=null

需要注意的是,由于可空属性,不设置该字段值时,也实际传递了10000000,同时PMap中第三位被置1表明传递了值。

 

问题:其他数据类型结果一致吗?

验证一致

 

2、COPY复制操作符

操作符

可空属性

PMap

说明

COPY复制

False/True

占1位

字符使用COPY操作符后,在PMap中将占用1位用以表示是否有传输该字段值。若PMap中该位值为0,表明未传递值,则该字段解析结果为“上一次传输的值--即复制”。若PMap中该位值为1,表明有传递值,则该字段解析结果以传递值为准。

 

FAST协议详解4 存在图PMap_操作符_03

上述代码运行结果如下:

msg111= -> {123, 1}

msg111= -> {123, 2}

msg111= -> {123, 2}

outByteStr=11100000,11111011,10110001,10100000,10110010,10000000,

二进制数据解析如下:

二进制数

解码结果

说明

11100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明有传输该字段

第三位是数据字段,这里表明有传输该字段

11111011

123

根据PMap得知有传输模版ID字段,故模版ID=123

10110001

49

根据PMap得知有传输数据字段,故数据字段=“1”

10100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明有传输该字段

10110010

50

根据PMap得知有传输数据字段,故数据字段=“2”

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明未传输该字段,根据操作符COPY得知应复制上一次传输的结果“2”。

 

3、INCREMENT复制操作符

操作符

可空属性

PMap

说明

INCREMENT递增

False/True

占1位

字符使用INCREMENT操作符后,在PMap中将占用1位用以表示是否有传输该字段值。若PMap中该位值为0,表明未传递值,则该字段解析结果为“上一次传输的值+1”。若PMap中该位值为1,表明有传递值,则该字段解析结果以传递值为准。

 

FAST协议详解4 存在图PMap_模版_04

上述代码运行结果如下:

msg111= -> {123, 1}

msg111= -> {123, 3}

msg111= -> {123, 4}

outByteStr=11100000,11111011,10000001,10100000,10000011,10000000,

二进制数据解析如下:

二进制数

解码结果

说明

11100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明有传输该字段

第三位是数据字段,这里表明有传输该字段

11111011

123

根据PMap得知有传输模版ID字段,故模版ID=123

10000001

1

根据PMap得知有传输数据字段,故数据字段=1

10100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明有传输该字段

10000011

3

根据PMap得知有传输数据字段,故数据字段=3

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明未传输该字段,根据操作符INCREMENT得知应将上一次传输的值+1,既=4。

 

4、TAIL接尾操作符

操作符

可空属性

PMap

说明

TAIL接尾

False/True

占1位

字符使用TAIL操作符后,在PMap中将占用1位用以表示是否有传输该字段值。若PMap中该位值为0,表明未传递值,则该字段解析结果为“上一次传输的值”。若PMap中该位值为1,表明有传递值,则该字段解析结果为上一次传输值+接尾部分。

 

FAST协议详解4 存在图PMap_模版_05

上述代码运行结果如下:

msg111= -> {123, 111}

msg111= -> {123, 111}

msg111= -> {123, 112}

outByteStr=11100000,11111011,00110001,00110001,10110001,10000000,10100000,10110010,

二进制数据解析如下:

二进制数

解码结果

说明

11100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明有传输该字段

第三位是数据字段,这里表明有传输该字段

11111011

123

根据PMap得知有传输模版ID字段,故模版ID=123

00110001,00110001,10110001

“111”

根据PMap得知有传输数据字段,故数据字段=“111”

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明未传输该字段,根据操作符TAIL得知应解析为上一次传输的值“111”

10100000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

第三位是数据字段,这里表明有传输该字段值

10110010

“2”

根据操作符TAIL的特性,应将“111”的最后一位替换为“2”,既最终解析结果为“112”

 

5、DEFAULT默认操作符1

操作符

可空属性

PMap

说明

CONSTANT常量

False

不占位

字段使用CONSTANT操作符且可空属性为False时,在PMap中不占位。编码时无论该字段是否有设置值,流中均不传输任何值,解析方只根据预设的常量值解析。

 

FAST协议详解4 存在图PMap_操作符_06

上述代码运行结果如下:

msg111= -> {123, 2}

msg111= -> {123, 2}

msg111= -> {123, 2}

outByteStr=11000000,11111011,10000000,10000000,

二进制数据解析如下:

二进制数

解码结果

说明

11000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明有传输该字段

对于CONSTANT操作符的字段,不占用PMap位,直接解析出预设值2

11111011

123

根据PMap得知有传输模版ID字段,故模版ID=123

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

对于CONSTANT操作符的字段,不占用PMap位,直接解析出预设值2

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

对于CONSTANT操作符的字段,不占用PMap位,直接解析出预设值2

 

问题:CONSTANT是否可以在编码时不设置值

FAST协议详解4 存在图PMap_模版_07

上述代码运行结果如下:

msg111= -> {123, 2}

msg111= -> {123, 2}

msg111= -> {123, 2}

outByteStr=11000000,11111011,10000000,10000000,

可见编码时无论是否设置值,解码都会解码成预设的值,且FAST流中不会传输该字段值。

 

问题:在编码时是否可以设置与预设值不一样的?

答:实践证明不行,会报错

 

6、DEFAULT默认操作符2

操作符

可空属性

PMap

说明

CONSTANT常量

True

占1位

字段使用CONSTANT操作符且可空属性为True时,在PMap中占1位。编码时若该字段有设置值,则PMap中该位值为1,表明字段不为空,应解析为预设值。编码时若该字段未设置值,则PMap中该位值为0,表明字段为空,应解析为null。

 

 

FAST协议详解4 存在图PMap_模版_08

上述代码运行结果如下:

msg111= -> {123, 2}

msg111= -> {123, 2}

msg111= -> {123, 2}

outByteStr=11100000,11111011,10100000,10100000,

 

 

FAST协议详解4 存在图PMap_字段_09

上述代码运行结果如下:

msg111= -> {123, null}

msg111= -> {123, null}

msg111= -> {123, null}

outByteStr=11000000,11111011,10000000,10000000,

 

7、NONE无操作符

操作符

可空属性

PMap

说明

NONE无

False/True

不占位

字段使用NONE操作符时,在PMap中不占位。即FAST流中一定会传输该字段值。

 

 

FAST协议详解4 存在图PMap_模版_10

上述代码运行结果如下:

msg111= -> {123, 1}

msg111= -> {123, 2}

msg111= -> {123, 3}

outByteStr=11000000,11111011,10000001,10000000,10000010,10000000,10000011,

二进制数据解析如下:

二进制数

解码结果

说明

11000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明有传输该字段

11111011

123

根据PMap得知有传输模版ID字段,故模版ID=123

10000001

1

对于NONE操作符字段,不看PMap,一定会传输值,故这里数据字段解析为1

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

10000010

2

对于NONE操作符字段,不看PMap,一定会传输值,故这里数据字段解析为2

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

10000011

3

对于NONE操作符字段,不看PMap,一定会传输值,故这里数据字段解析为3

 

问题:可空情况的处理

FAST协议详解4 存在图PMap_操作符_11

上述代码运行结果如下:

msg111= -> {123, 1}

msg111= -> {123, null}

msg111= -> {123, 3}

outByteStr=11000000,11111011,10000010,10000000,10000000,10000000,10000100,

二进制数据解析如下:

二进制数

解码结果

说明

11000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明有传输该字段

11111011

123

根据PMap得知有传输模版ID字段,故模版ID=123

10000010

1

对于NONE操作符字段,不看PMap,一定会传输值,故这里数据字段解析为2-1=1(可空字段要自行-1)

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

10000000

Null

对于NONE操作符字段,不看PMap,一定会传输值,故这里数据字段解析为null(可空字段0就是null)

10000000

PMap

PMap第一位是停止位

第二位是模版ID,这里表明未传输该字段,则模版ID值沿用上一次的结果=123

10000100

3

对于NONE操作符字段,不看PMap,一定会传输值,故这里数据字段解析为4-1=3(可空字段要自行-1)

 

四、回顾

通过实例分析可见,PMap其实与操作符强相关,且大部分操作符都会使字段在PMap中占1位,占位目的是为了通过0和1来标识字段是否传输值,比如copy操作符,如对应PMap位为1则表明不传输该字段值,则解码时自动复制上一次解码结果。



标签:123,模版,FAST,传输,详解,操作符,PMap,ID
From: https://blog.51cto.com/u_13710618/8003359

相关文章

  • FAST协议详解5 后记
    这段时间,花了不少精力来学习FAST协议,大致梳理下,相关博文: 1、FAST协议解析1通过输入输出逆解析 2、FAST协议解析2FIXFastTutorial翻译【PMap、copy操作符】 3、FAST协议解析3FIXFastTutorial翻译HelloWorld示例 4、FAST协议详解1不同数据类型的编码与解码 5、FAST协议......
  • servlet 生命周期详解
    servlet程序是由web服务器调用,web服务器实现了对servlet生命周期的管理。当你的应用加载并使用一个Servlet时,从初始化到销毁这个Servlet期间会发生一系列的事件,这些事件叫做Servlet的生命周期事件(或方法)。Servlet生命周期可以归纳为:Servlet加载--->实例化--->服务--->销毁周期原......
  • servlet 运行工作原理详解
    Servlet是一门用于开发动态web网页的技术,用于交互式地浏览和修改数据,生成动态Web内容。本文将重点讲解它的工作原理,运行机制是什么。工作原理图工作流程1.WebClient向Servlet容器(Tomcat)发出Http请求2.Servlet容器接收WebClient的请求3.Servlet容器创建一个HttpRequest对象,将W......
  • servlet 入门详解
    Servlet是一种服务器端的编程语言,是J2EE中比较关键的组成部分。Servlet本质上也是Java类,编写Servlet需要遵循java的基本语法,但是与一般的Java类不同的是Servlet是只能运行在服务器端的Java类,而且必须遵循特殊的规范,在运行过程中有自己的生命周期,这些特性都是Servlet所独有的。另外S......
  • servlet service()请求处理方法详解
    service()方法是Servlet的核心,是在servlet生命周期中的服务期,默认在HttpServlet类中实现,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法实现。Servlet接口中定义了一个service()方法,而我们一般是使用HttpServlet,HttpServlet中对它进行了实现,将ServletRequest和Servle......
  • HttpServletRequest客户请求对象详解
    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。方法1.获取客户机信息方法声明功能描述StringgetMethod()该方法用于获取HTTP请求消息中的请求方式(如GET、POST......
  • Servlet Cookie对象详解
    Cookie是服务器发送给浏览器的体积很小的纯文本信息,用户以后访问同一个Web服务器时浏览器会把它们原样发送给服务器。cookie一般用于在线交易过程中标识用户身份、安全要求不高的场合避免用户重复输入名字和密码、门户网站的主页定制、有针对性地投放广告等等。 Servlet中可以同时......
  • Java中Servlet Filter配置(web.xml详解)
    Java中ServletFilter在web.xml中配置时有2个用于过滤器的元素,分别是filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。Filter配置过滤器元素filter元素filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、serv......
  • Chromium 消息循环和线程池详解
    Chromium中的多线程机制由base库提供,要理解Chromium中的多线程机制,首先要理解的概念就是 base::MessageLoop 和 base::TaskScheduler ,它们两个是Chromium多线程的基础1. MessageLoop详解base::MessageLoop 代表消息循环,它不会主动创建新的线程,默认情况下它使用当前......
  • Spring MVC入口Servlet详解(HttpServletBean,FrameworkServlet,DispatcherServlet )
    SpringMVC中DispatcherServlet前端控制器是web服务器的入口,那么它是怎么样进行初始化的,是怎么样进行工作?继承关系1.HttpServletBean主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。2.FrameworkServlet将Serv......