FAST协议详解1 不同数据类型的编码与解码

news2024/11/29 12:33:06

一、概述

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什么的才是硬骨头。

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

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

相关文章

一文了解 Android Auto 车载开发~

作者:牛蛙点点申请出战 背景 我的的产品作为一个海外音乐播放器,在车载场景听歌是一个很普遍的需求。在用户反馈中,也有很多用户提到希望能在车上播放音乐。同时车载音乐也可以作为提升用户消费时长一个抓手。 出海产品,主要服务…

[国产MCU]-BL602开发实例-定时器

定时器 文章目录 定时器1、BL602定时器介绍2、定时器驱动API介绍3、定时器使用实例3.1 单次计时3.2 持续计时通用定时器,用于定时,当时间到达我们所设置的定时时间会产生定时中断,可以用来完成定时任务。本文将详细介绍如何使用BL602的定时器功能。 1、BL602定时器介绍 BL6…

vscode自动添加注释说明

1. 安装vscode 双击安装程序,默认安装即可(如:VSCodeSetup-x64-1.70.2.exe) 2. 安装doxygen文档生成插件 1> 打开vscode软件,点击左侧插件管理菜单 2> 点击右上角’…‘按钮,选择’Install from VSIX’(联网状态可以直接搜索doxygen下载安装) 3> 选择doxygen离线安装…

torchvision.datasets数据加载失败

torchvision.datasets数据加载失败 如何使用torchvision.datasets进行自动下载数据失败,可以使用手动下载数据 Ctrl点击可以进入相关包文件,查找下载地址:https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 手动下载之后解压&#x…

【Spring】(四)Bean 的作用域和生命周期

文章目录 前言一、Bean 的作用域1.1 被修改的 Bean 案例1.2 作用域的定义1.3 Bean 的六种作用域1.4 Bean 作用域的设置 二、Spring 的执行流程 和 Bean 的生命周期2.1 Spring 的执行流程2.2 Bean 的生命周期2.3 Bean 生命周期的演示 前言 Bean 是 Spring 框架中的一个核心概念…

Benchmarking Augmentation Methods for Learning Robust Navigation Agents 论文阅读

论文信息 题目:Benchmarking Augmentation Methods for Learning Robust Navigation Agents: the Winning Entry of the 2021 iGibson Challenge 作者:Naoki Yokoyama, Qian Luo 来源:arXiv 时间:2022 Abstract 深度强化学习和…

AssetBundleBrowser导入报错解决方案

第一次导入AssetBundleBrowser遇到报错有 Assets\Scenes\AssetBundles-Browser-master\AssetBundles-Browser-master\Tests\Editor\ABModelTests.cs(13,7): error CS0246: The type or namespace name Boo could not be found (are you missing a using directive or an assem…

24届近5年杭州电子科技大学自动化考研院校分析

今天给大家带来的是杭州电子科技大学控制考研分析 满满干货~还不快快点赞收藏 一、杭州电子科技大学 学校简介 杭州电子科技大学(Hangzhou Dianzi University),简称“杭电”,位于杭州市,是浙江省人民政…

Containerd容器镜像管理

1. 轻量级容器管理工具 Containerd 2. Containerd的两种安装方式 3. Containerd容器镜像管理 4. Containerd数据持久化和网络管理 1、Containerd镜像管理 1.1 Containerd容器镜像管理命令 docker使用docker images命令管理镜像单机containerd使用ctr images命令管理镜像,con…

消息队列 -封装数据库的操作

前言 上一篇博客我们写了, 关于交换机, 队列,绑定, 写入数据库的一些建库建表的操作 这一篇博客中,我们将建库建表操作,封装一下实现层一个类来供上层服务的调用 , 并在写完该类之后, 测试代码是否完整 实现封装 在写完上述的接口类 与 xml 后, 我们想要 创建一个类 ,来调用…

Neety与IO模型简介

Netty与IO模型简介 1、Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目。 2、Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。 3、Netty 主要针对在 TCP 协议下,面向…

2023牛客暑期多校训练营7-c-Beautiful Sequence

思路: ,则有,也就是说只要知道A1就可以求任意A。由于A是升序排列,所以对于任意,二进制所包含1的最高位第k位来说,表明与第k位相反,要大一些,所以它的第k位为1,的第k位为…

echarts 柱状图 实例

实例效果: 代码: draw(data1, data2,data3) {var option {// backgroundColor: rgb(10,36,68),tooltip: {trigger: axis,axisPointer: {type: shadow,},formatter: function (params: any, ticket: any, callback: any) {const item params[0];var str…

关于“为爱发电”的一些说明~~

对不起,兄弟们,收费了。。 1. 为什么设置收费 emm...混口饭吃。 也是大龄程序员积在极探索挣钱之路。 2. 都有哪些服务 本专栏的手把手教学资料工程文件,但是近期忙于CMN,可能没时间答疑和讨论,见谅。 另外&#xff0…

知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例,Neo4j图算法是一套在Neo4j图数据库上运行的算法集合。这些算法专门针对图数据结构进行设计,用于分析、查询和处理图数据。图算法可以帮助我们发现图中的模…

class version 61 java version 17.0.4

class version (javap -verbose xxxx.class)_spencer_tseng的博客-CSDN博客

概念解析 | 合成孔径雷达中运动补偿与自聚焦的关系

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:合成孔径雷达中运动补偿和自聚焦的联系与差别 概念解析 | 合成孔径雷达运动补偿与自聚焦的关系研究 基于二维空变运动补偿的机动平台大斜视SAR稀疏自聚焦方法 一、背景介绍 合成…

qt源码---事件系统之QCoreApplication

上一节分析了qt和windows系统之间的消息的传递,本节着重看一下,qt内部的事件是如何传递的? 1.sendEvent函数 在使用的自定义事件时,有时需要手动抛出一个事件,常用的方式有2种,其一时阻塞式的sendEvent函…

优化手机性能,解决卡顿问题:关闭这3个微信开关,释放内存空间

在日常使用手机的过程中,微信无疑是受欢迎和广泛使用的社交应用之一。然而,由于微信的一些默认设置可能会占用大量内存空间,导致手机性能下降并出现卡顿问题。为了提高手机的运行效果,我们需要注意并关闭这3个微信开关&#xff0c…

面试热题(环形链表II)

给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引…