FAST协议解析1 通过输入输出逆解析

news2024/11/16 19:28:31

一、前言

FAST协议可以支持金融机构间高吞吐量、低延迟的数据通讯,目前我知道的应用领域是沪深交易所的Level-2行情传输。网络上无论是FAST协议本身,还是使用相关工具(openfast、quickfast)对FAST行情进行解析,相关的资料都是凤毛麟角,能够找到本篇的同学那是缘分不浅了。

如果要理解FAST协议,建议还是先用会openfast或quickfast,先用现成的工具实现数据的编码和解码,然后再自己理解协议并手写编码解码,简单来说就是有个对照。我这里使用的是openfast。

二、openfast的编码与解码

如果想了解openfast如何解析FAST数据的完整示例,可以参考我之前的博文。这里我们先简单回顾一下openfast的编码和解码。

完整代码下载:https://share.weiyun.com/jQseMppi

1、消息模版

如下图所示,我们借用UA3815这个消息模版。

2、编码、解码

如下图所示,使用openfast自己先编码再解码,我是参考的一条真实UA3815消息的FAST数据。

输出结果如下,第一行是FAST消息解码结果(解码验证),第二行是将FAST数据按byte输出(编码验证)。

实验结果证明编码与解码的结果符合预期。实际上我也对FAST的byte输出进行了验证,与实际的收到的FAST数据是一致的。

三、openfast逆解析

我找了不少文档看,是真的看不明白,最后想到既然有openfast这个工具,为啥不利用工具来逆解析呢?事实证明效果非常好,而FAST协议真的很简单。下面我们直接来看结果。

1、示例代码

对模版和代码进行修改简化。

代码这里只是做个修改的示例,后面的修改不再赘述。

2、一个int32

下图分别是对空数据、0、1、2、3...256进行FAST编码后的结果,将其转为2进制后可以看到非常明显的规律。

规律一:FAST编码后的数据可以分为三个区域

如下图所示。而且区域三很明显是数值部分,也就是对int 0 FAST编码后的结果就是1000 0000。对256编码的结果就是0000 0010 1000 0000。接着我们就能发现下一个规律。

规律二:数值部分是128进制

也就是每一段(一个byte)满128向前进一位。

127-> 0000 0000, 1111 1111

128-> 0000 0001, 0000 0000

对于更大的数,则是128*128=16384进一位,这时候就需要第三段。

16383-> 0000 0000, 0111 1111, 1111 1111

16384-> 0000 0001, 0000 0000, 1000 0000

以此类推,如果是大于等于128*128*128=2097152,则需要第四段

2097152-> 0000 0001, 0000 0000, 0000 0000, 1000 000

3、两个int32

我们修改代码,这次输入2个int32值看下FAST编码的结果。

规律三:每一个byte的第一位是“分隔符”(停止位)

这里的分隔不仅将不同区域分隔,同一区域的不同字段也使用首位的“1”来分隔。

规律四:区域一标识了当前有多少个字段。

区域一的值:

空-> 1100 0000

一个数值字段-> 1110 0000

两个数值字段-> 1111 0000

我试了下14个数值字段:0111 1111,0111 1111,1100 0000

如下图,区域一标识了区域二(占一位),区域三(有多少个字段就标识多少个1)。同时区域一还遵循了规律三。

4、修改模版ID

输出结果:

规律五:区域二标识的是注册的模版ID,但与模版文件里的ID无关系。

5、数值类型

做沪市FAST行情解析,目前来看只用到了int32、int64、string三种类型,我们各放一个字段试试。

修改模版:

修改代码:

输出结果:

可以看到,int32和int64在FAST编码时无区别。

String则是直接转成了ASCII码:55->7、56->8、(185-128)=57->9

四、FAST编码解码基本规则

综上,我们通过openfast的使用,对FAST编码解码规则有了一些较为浅显的理解,现结合官方文档(https://jettekfix.com/education/fix-fast-tutorial/)总结如下:

规则一:FAST数据可分为三个区域,区域一是PMap字段(存在图),作用是标识出消息中的字段数量。区域二是模版ID字段,作用是标识出你注册的模版ID号,但这个ID与模版文件中的ID无关系。区域三是数值部分,可由多个字段顺序组成。

规则二:字段大小可变,通过对“停止位”的使用,将每个字节的第一位置为0或1以标识出该字段是否结束。其中0表示未结束,1表示结束。

规则三:数值需要按byte去掉第一位的0或1再来算值。Int类型直接二进制转整数,string类型则是二进制先转整数再由ASCII码表转字符。

五、回顾

本篇我们利用openfast来逆解析FAST协议,这么做之前,看相关文档资料即使是中文的也看不明白,但自己尝试了一下之后,发现即使是英文文档也能看明白了。

但目前只是总结了一些基本规律,看文档发现,还有很多知识点在模版上,后面再花时间研究了。关于这部分,可能直接翻译官方文档并使用openfast验证比较好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MC9S12G128开发板—解决小车九宫格方位移动功能实现遇到的一些问题

接着我的上一篇文章:MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能。本篇文章主要记录下在实现小车九宫格方位移动功能过程中,遇到的一些程序问题以及解决措施。 1. 上位机小车响应开发板按键CAN报文指令的响应出错问题 问题现象描述&#x…

自动驾驶行业观察之2023上海车展-----车企发展趋势(1)

新势力发展趋势 小鹏汽车:发布新车G6(中型SUV),将于2023年年中上市 发布新车G6:车展上,小鹏G6正式首发亮相,定位中型SUV,对标Tesla Model Y,将于2023年年中上市并开始交…

基于web的商场商城后台管理系统

该系统用户分为两类:普通员工和管理员。普通员工是指当前系统中的需要对商品和客户的信息进行查询的人。此类用户只能查看自己的信息,以及对商品和客户的信息进行查看。管理员用户可以对自己和他人的信息进行维护,包括对商品入库、销售、库存…

Redis缓存过期淘汰策略

文章目录 1、如何设置 Redis 最大运行内存?2、过期删除策略3、内存淘汰策略 1、如何设置 Redis 最大运行内存? 在配置文件 redis.conf 中,可以通过参数 maxmemory 来设定最大运行内存,只有在 Redis 的运行内存达到了我们设置的最…

代码命名规范

日常编码中,代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图,也是一项必备的能力。那它们有什么规律呢? Java项目的代码结构,能够体现它的设计理念。Java采用长命名的方式来规范类的命名,能够自己表达…

消息称苹果Type-C口充电未设MFi限制,iOS17将更新Find My服务

根据国外科技媒体 iMore 报道,基于消息源 analyst941 透露的信息,苹果公司目前并未开发 MFi 限制。 根据推文信息内容,两款 iPhone 15 机型的最高充电功率为 20W,而 iPhone 15 Pro 机型的最高支持 27W 充电。 此前古尔曼表示苹…

Python趋势外推预测模型实验完整版

趋势外推预测模型实验完整版 实验目的 通过趋势外推预测模型(佩尔预测模型),掌握预测模型的建立和应用方法,了解趋势外推预测模型(佩尔预测模型)的基本原理 实验内容 趋势外推预测模型 实验步骤和过程…

第4章-虚拟机栈(多使用到jclasslib工具查看字节码)

虚拟机栈 简介 虚拟机栈的出现背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的【如果设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对具体的CPU架…

警惕免杀版Gh0st木马!

https://github.com/SecurityNo1/Gh0st2023 经过调查发现,这款开源的高度免杀版Gh0st木马目前正在大范围传播,据称可免杀多种主流杀软:开发者不仅制作了新颖的下载页面,还设法增加了搜索引擎的收录权重,吸引了许多免…

Python基础合集 练习17(类与对象)

class Dog: pass papiDog() print(papi) print(type(papi)) 构建方法 创建类过后可以定义一个特殊的方法。在python中构建方法是__init__(),init()必须包含一个self参数 class pig(): #def__init__(self) -> None: print(‘你好’) pipgpig() 属性和方法 cl…

JDBC详解(六):数据库事务(超详解)

JDBC详解(六):数据库事务(超详解) 前言一、数据库事务介绍二、JDBC事务处理三、事务的ACID属性1、数据库的并发问题2、四种隔离级别3、在MySql中设置隔离级别 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所…

MySQL基础——数据模型·数据库操作

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易&…

开放原子训练营(第一季)铜锁探密:基于铜锁,在前端对登录密码进行加密,实现隐私数据保密性

本文将基于 铜锁(tongsuo)开源基础密码库实现前端对用户登录密码的加密,从而实现前端隐私数据的保密性。 首先,铜锁密码库是一个提供现代密码学算法和安全通信协议的开源基础密码库,在中国商用密码算法,例…

vcruntime140_1.dll无法继续执行代码怎么修复

vcruntime140_1.dll 是 Microsoft Visual C 程序集中的一个动态链接库文件。该文件提供了一些 C 运行时函数,这些函数是由许多应用程序使用的。当一个程序需要某个 DLL 文件时,它会首先在系统目录和程序所在目录中查找该 DLL 文件。如果系统或程序目录中…

《密码法》

第一章 总 则 第一条 为了规范密码应用和管理,促进密码事业发展,保障网络与信息安全,维护国家安全和社会公共利益,保护公民、法人和其他组织的合法权益,制定本法。 第二条 本法所称密码,是指采用特定变…

JavaSE基础(三)—— 程序流程控制、Random随机数

目录 一、顺序结构 二、分支结构 1. if 1.1 if分支有三种格式​编辑 2. switch 2.1 if、switch分支各自适合做什么业务场景 3. switch的穿透性 三、循环结构 1. for 循环​编辑 2. while 循环 2.1 什么时候用for循环,什么时候用while循环 3. do-while循…

探索抖音全域兴趣电商的特点与优势

抖音全域兴趣电商是抖音在电商领域的一项创新业务。它是一种全新的购物方式,通过抖音平台提供的社交化购物体验,将用户的兴趣、购物需求和商品展示相结合,为用户提供更为个性化、精准的购物体验。下面四川不若与众将对抖音全域兴趣电商进行一…

uboot start_armboot函数 第二阶段代码分析

1.1、start_armboot函数简介 这个函数整个构成了uboot启动的第二阶段。 1.2、uboot第二阶段做的事情 uboot第一阶段主要就是初始化了SoC内部的一些部件(譬如看门狗、时钟、串口…),然后初始化DDR并且完成重定位。那么,uboot的第…

Win10配置ESP32-IDF+VSCode开发环境

一、安装包下载: Git:Git for WindowsPython:Download Python | Python.org以Windows x86-64开头的是 64 位的 Python 安装程序;以Windows x86开头的是 32 位的 Python 安装程序。ESP-IDF(选择Offline版本&#xff09…

【微机原理】8088/8086的寻址方式

目录 一.指令的组成 二.操作数的寻址方式 1.立即数寻址 2.寄存器寻址方式 3.存储器寻址方式 (1)直接寻址 (2)寄存器间接寻址 (3)寄存器相对寻址方式 (4)基址变址寻址方式&#xff08…