FAST协议详解1 不同数据类型的编码与解码
一、概述
FAST协议里不同的数据类型在编码时有非常大的区别,比如整数只需要将二进制数据转为十进制即可,而浮点数则需要先传小数点位数,再传一个整数,最后将二者结合起来才是最终结果。本篇使用openfast自设了一些数据并编码成FAST数据,再对这些FAST数据进行人工解码,以图看懂FAST协议是如何传递不同类型的数据。
二、数据类型
看接口文档,存在以下类型的数据:
| 数据类型 | 说明 | 备注 |
| ascii | ASCII字符串类型 | |
| byteVector | 字节向量类型 | |
| decimal | 浮点数类型 | |
| int16 | 有符号整数 | 都是有符号整数,区别仅在于取值范围 |
| int32 | 有符号整数 | |
| int64 | 有符号整数 | |
| int8 | 有符号整数 | |
| string | 字符串 | |
| uInt16 | 无符号整数 | 都是无符号整数,区别仅在于取值范围 |
| uInt32 | 无符号整数 | |
| uInt64 | 无符号整数 | |
| uInt8 | 无符号整数 |
浓缩一下:
| 数据类型 | 说明 | 备注 |
| ascii | ASCII字符串类型 | |
| string | 字符串 | |
| byteVector | 字节向量类型 | |
| decimal | 浮点数类型 | |
| int | 有符号整数 | |
| uInt | 无符号整数 |
三、不同数据类型的编码与解码
1、ASCII字符串类型

使用上述代码输出为:
msg111= -> {123, 234}
outByteStr=11100000,11111011,00110010,00110011,10110100,
二进制数据解析如下:
| 二进制数 | 解码过程 | 解码结果 |
| 11100000 | PMap | |
| 11111011 | 01111011=123 | 123 |
| 00110010,00110011,10110100 | 00110010=50=’2’ 00110011=51=’3’ 00110100=52=’4’ | 124 |
2、String字符串类型

使用上述代码输出为:
msg111= -> {123, 234}
outByteStr=11100000,11111011,00110010,00110011,10110100,
二进制数据解析如下:
| 二进制数 | 解码过程 | 解码结果 |
| 11100000 | PMap | |
| 11111011 | 01111011=123 | 123 |
| 00110010,00110011,10110100 | 00110010=50=’2’ 00110011=51=’3’ 00110100=52=’4’ | 124 |
ASCII与string编码、解码一致,看不出区别。
3、int有符号整数类型

使用上述代码输出为:
msg111= -> {123, 234}
outByteStr=11100000,11111011,00000001,11101010,
二进制数据解析如下:
| 二进制数 | 解码过程 | 解码结果 |
| 11100000 | PMap | |
| 11111011 | 01111011=123 | 123 |
| 00000001,11101010 | 00000001=1*128=128 01101010=106 128+106=234 | 234 |
将输入修改为负值
msg111= -> {123, -234}
outByteStr=11100000,11111011,01111110,10010110
二进制数据解析如下:
| 二进制数 | 解码过程 | 解码结果 |
| 11100000 | PMap | |
| 11111011 | 01111011=123 | 123 |
| 01111110,10010110 | 01111110->1111110 10010110->0010110 实际:11111100010110 =-234 | 234 |
问题:有符号整数如何传输负值?
可以看到,在传输234这个值时,我们解码的方式是将2个字节分开,前面的字节转十进制后乘以128,后面的字节直接转十进制,然后两个十进制数相加。
在传输-234时,是两个字节分别去掉第一个位(停止位),拼接起来直接转成了十进制。
我们知道,在计算机中,对于有符号整数的二进制存储,是默认了,第一个位是1的话认为是负数,第一个位是0的话则认为是正数。这里也是一样,去掉每个字节的第一个位(停止位)后,第一个位如果是1则认为是负数,适用负数转换规则。第一个位如果是0则认为是正数,适用正数转换规则。
对于一些数值,刚好第一位是1该如何处理,比如126=1111110?
msg111= -> {123, 126}
outByteStr=11100000,11111011,00000000,11111110,
实例如上,只需要在前面补0即可。
4、uInt无符号类型

使用上述代码输出为:
msg111= -> {123, 126}
outByteStr=11100000,11111011,11111110,
二进制数据解析如下:
| 二进制数 | 解码过程 | 解码结果 |
| 11100000 | PMap | |
| 11111011 | 01111011=123 | 123 |
| 11111110 | 01111110=126 | 126 |
可见,对于无符号数,直接按正数规则解码即可。
5、decimal浮点数类型

使用上述代码输出为:
msg111= -> {123, 234.456}
outByteStr=11100000,11111011,11111101,00001110,00100111,11011000,
二进制数据解析如下:
| 二进制数 | 解码过程 | 解码结果 |
| 11100000 | PMap | |
| 11111011 | 01111011=123 | 123 |
| 11111101 | 11111101=-3 | -3 |
| 00001110,00100111,11011000 | 00001110=14 00100111=39 01011000=88 14*128*128+39*128+88=234456 | 234456 |
很容易看明白,对浮点数进行编码时分成了2个部分,第一部分是“小数点”位数,第二部分是整数。解码后将两部分合并才能得到最终结果。
问题:如何传递负浮点数?
将234.456修改为-234.456后,输出为:
msg111= -> {123, -234.456}
outByteStr=11100000,11111011,11111101,01110001,01011000,10101000,
二进制数据解析如下:
| 二进制数 | 解码过程 | 解码结果 |
| 11100000 | PMap | |
| 11111011 | 01111011=123 | 123 |
| 11111101 | 11111101=-3 | -3 |
| 01110001,01011000,10101000 | 111000110110000101000=-234456 | -234456 |
与有符号整数差不多,是否传递负数,只需要将除去“停止位”后,判断第一个位是否是“1”即可。所以只需要将浮点数的传递看成是“小数点”+“整数”两个部分即可。
6、byteVector字节向量类型
前面我们讨论了整数、浮点数、字符串,所有的编码其实都遵循了一个原则,即一个字节能够传递的最大值只能小于128,要传递更大的值则需要“进位”。但我们需要传递的字节一定要大于128该如何是好,比如中文。我们使用前面的字符串、ASCII、整数,也不是不能编码,但解码起来就有点麻烦。很明显这时候就可以用到字节向量。

使用上述代码输出为:
msg111= -> {123, ????????}
outByteStr=11100000,11111011,10001000,11001110,11111011,11001110,11111011,10111001,11111110,10111001,11111110,
二进制数据解析如下:
| 二进制数 | 解码过程 | 解码结果 |
| 11100000 | PMap | |
| 11111011 | 01111011=123 | 123 |
| 10001000 | 00001000=8 | 8个字节 |
| 11001110,11111011, 11001110,11111011, 10111001,11111110, 10111001,11111110 | 11001110,11111011=CE FB 11001110,11111011=CE FB 10111001,11111110=B9 FE 10111001,11111110=B9 FE CEFB CEFB B9FE B9FE=嘻嘻哈哈 | 嘻嘻哈哈 |
有点类似浮点数的编码,这里先传递字节向量的长度“8”,接着传递字节向量。由于字节向量的长度已指定,故传输数据时不再遵循停止位的概念。
另注意这里使用的是GBK编码,故直接输出是乱码。
四、回顾
| 数据类型 | 说明 | 备注 |
| ascii | ASCII字符串类型 | 遵循一般停止位规则,最后一个字节的第一位为1则是该字段最后一个字节,而后根据ASCII码表直接转字符串即可。 |
| string | 字符串 | 同上 |
| int | 有符号整数 | 遵循一般停止位规则,注意第一位(除开停止位之外的)为“0”则是正整数,则按128进位的规则进行数值转换即可。第一位(除开停止位之外的)为“1”则是负整数,则将全部字节去掉停止位后,直接转为整数即可。负数转换时需要注意前面要补1。 |
| uInt | 无符号整数 | 遵循一般停止位规则,由于知道一定是正整数,则直接按128进位的规则进行数值转换即可。 |
| decimal | 浮点数类型 | 分两部分进行传递,两个部分均遵循一般停止位规则。第一部分是浮点数的“小数点位数”,第二部分则是整数。注意是有符号整数,遵循int的解码方式即可。 |
| byteVector | 字节向量类型 | 分两部分进行传递,第一部分是字节向量的长度,遵循一般停止位规则。第二部分则是纯byte数据,不再遵循停止位规则,但由于前面有传递其长度,故也不会出错。 |
结语:这里只是最基本的编码解码规则,到这里也只是能稍微看懂一点还无法进行真正的FAST解码。后面的“操作符”及null什么的才是硬骨头。
相关文章:
FAST协议详解1 不同数据类型的编码与解码
一、概述 FAST协议里不同的数据类型在编码时有非常大的区别,比如整数只需要将二进制数据转为十进制即可,而浮点数则需要先传小数点位数,再传一个整数,最后将二者结合起来才是最终结果。本篇使用openfast自设了一些数据并编码成FA…...
黑马大数据学习笔记5-案例
目录 需求分析背景介绍目标需求数据内容DBeaver连接到Hive建库建表加载数据 ETL数据清洗数据问题需求实现查看结果扩展 指标计算需求需求指标统计 可视化展示BIFineBI的介绍及安装FineBI配置数据源及数据准备 可视化展示 P73~77 https://www.bilibili.com/video/BV1WY4y197g7?…...
网络编程——TCP/IP协议族(IP协议、TCP协议和UDP协议……)
TCP/IP协议族 一、IP协议 1、IP协议简介 IP协议又称网际协议 特指为实现在一个相互连接的网络系统上从源地址到目的地传输数据包(互联网数据包)所提供必要功能的协议,是网络层中的协议。 2、特点 不可靠:它不能保证IP数据包能成功地到达它的目的地,仅…...
Oracle SQL存储过程能够返回表吗
使用Oracle游标返回表数据 在Oracle存储过程中,我们可以使用游标来返回表的数据。游标是一种类似于指针的数据类型,可以用来遍历和操作结果集。以下是一个示例的Oracle存储过程,通过游标返回表数据: CREATE OR REPLACE PROCEDUR…...
2 Vue使用v-bind来代替{{}}取值
注意!当两个具有共同id的标签都要从数据层拿值时,需要使用div标签,赋予他们共同的id,不然其中有一个会拿不到数据! v-bind用来绑定前标签的属性,然后对属性赋值。{{}}用来对前后标签中的文本赋值。使用方法…...
20230807在WIN10下使用python3将TXT文件转换为DOCX(在UTF8编码下转换为DOCX有多一行的瑕疵)
20230807在WIN10下使用python3将TXT文件转换为DOCX(在UTF8编码下转换为DOCX有多一行的瑕疵) 2023/8/7 12:58 https://translate.google.com/?slen&tlzh-CN&opdocs 缘起,由于google的文档翻译不支持SRT/TXT格式的字幕,因此…...
Flutter(八)事件处理与通知
1.原始指针事件处理 一次完整的事件分为三个阶段:手指按下、手指移动、和手指抬起,而更高级别的手势(如点击、双击、拖动等)都是基于这些原始事件的。 Listener 组件 Flutter中可以使用Listener来监听原始触摸事件 Listener({…...
Java,python,c#,js,c++搞量化交易的接口大全
股票基金api接口地址:https://stockapi.com.cn 不想自己写的:https://stockapi.com.cn 除了牛逼,只剩下牛逼,除了方便,只剩下方便,python不是唯一的量化编程语言 接口说明:日线macd指标 https:/…...
javaAPI(一):String
String的特性 String底层源码 1、String声明为final,不可被继承 2、String实现了Serializable接口:表示字符支持序列化 实现了Comparable接口:表示String可以比较大小 3、String内部定义了final char[] value用于存储字符串 4、通过字面量的…...
数据互通,版本管理优化图文档与BOM数据
在现代企业的产品开发过程中,图文档和BOM数据是不可或缺的关键要素。图文档记录了产品的设计和工程信息,而BOM数据则明确了产品所需物料的清单和规格。然而,由于数据的复杂性和版本变更的频繁性,图文档与BOM数据之间的协作和管理常…...
【CSS】旋转中的视差效果
效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"/><meta name"viewport" content"widthdevice-…...
【ASP.NET MVC】使用动软(一)(9)
一、解决的问题 前文为解决数据库操作设计的 TestMysql 类,仅简单地封装了一个Query函数,代码如下: public class TestMysql{public static string SqlserverConnectStr "server127.0.0.1;charsetutf8;user idroot;persistsecurityin…...
【Jsp课设】3款基于JavaWeb的学生选课管理系统
项目介绍:后端采用JspServlet。前端使用的是Layui的一个网站模板。开发一个在线的学生选课管理系统,用于课程设计的使用。 项目类型:JavaWeb源码 用户类型:2个角色(管理员学生) 主要技术:JspSe…...
系统架构设计师笔记第35期:表现层框架设计
表现层框架设计是指在软件系统中,将用户界面(UI)和用户交互逻辑与后端业务逻辑分离,使用特定的框架来组织和管理表现层的功能和结构。下面是表现层框架设计的一般步骤和常用技术: 确定需求和功能:首先&…...
力扣 -- 467. 环绕字符串中唯一的子字符串
一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int findSubstringInWraproundString(string s) {int ns.size();vector<int> dp(n,1);int re…...
Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs
目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfsHi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs 关于 Debian rootfs Debian 没有像 Ubuntu 提供 Ubuntu-…...
面试热题(字符串相加)
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 输入:num1 "11"…...
我的创作纪念日【第一个2048day】
机缘 初心:研究生期间,帮老师做一个项目,过程中学习的东西想记录下来,于是,就选择了CADN让技术分享成为工作的一部分 收获 获得了1800多粉丝的关注获得了63万的访问量,其中《C#设计模式》专栏深受大家喜欢…...
内网穿透-————SSH远程连接树莓派
前言 文章目录 前言内网穿透实现公网SSH远程连接树莓派1. 在树莓派上安装[cpolar客户端](https://www.cpolar.com/)2. 在树莓派浏览器中输入本地9200端口3. 在公共互联网的电脑的命令行界面输入命令 内网穿透实现公网SSH远程连接树莓派 随着科技的进步和信息技术的发展&#x…...
一键开启ChatGPT“危险发言”
大数据文摘授权转载自学术头条 作者:Hazel Yan 编辑:佩奇 随着大模型技术的普及,AI 聊天机器人已成为社交娱乐、客户服务和教育辅助的常见工具之一。 然而,不安全的 AI 聊天机器人可能会被部分人用于传播虚假信息、操纵舆…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
