FAST协议详解3 可null(空)类型

news2025/1/18 17:02:18

一、概述

所谓可null、可空,其实是一个特性的两个方面,某些情况下,我们不需要传递某个字段的值,则可以将该字段“空”起来,不赋值,则接收方在收到该字段时会自动解析为null值。所以空是对于发送方而言,而null则是对于接收方而言,但FAST流中并不会因为没有对该字段赋值就可以节省下一个字节,而是需要传递一个特殊值来告知接收方这个字段未赋值,接收方应解析为null。不同的数据类型为适应可null(空)的特性有一些较奇怪的变换,下面看实例。

这里先回顾一下scalar这个类,可见是通过修改optional来设置字段是否可空。

二、不同数据类型的可null(空)

数据类型

说明

INTEGER整数

可空整数,编码后数值+1。比如我要传递1,则实际传递的是2,解码方收到后自行减去1。原因是要用0值代表null。但传递负值时就不需要再自行减1了。

ASCII字符串

可空字符串,编码后数值不变。但需要区分null、空字符串、\0。

10000000->null

00000000 10000000->空字符串

00000000 00000000 10000000->\0

STRING字符串

同上

BYTEVECTOR字节向量

字节向量分为长度和数据两部分,其中长度部分若为10000000则表明字段为null,而10000001则表明字节向量长度为0,故而长度部分在解码后需要自行减去1。

DECIMAL浮点数

浮点数的传输也分为两部分,第一部分是小数点位数,第二部分是数值。 其中小数点位数部分若为10000000则表明字段为null,但正常传递浮点数时位数部分不需要再减去1,比如-2是“11111110”,只有传递1这样无小数点的数值时,由于其小数点位数为“10000000”,必须要再加1。所以小数点位数部分在负值时不需要自行减1,在正直时需要自行减1。

三、可null(空)实例

1、INTEGER整数

上述代码运行结果如下:

msg111= -> {123, 1, null, 3}

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

可以看到第二个字段传输的值是10000000,在这里会解析为null

问题:如何传递非空值?

上述代码运行结果如下:

msg111= -> {123, 1, 2, 3}

outByteStr=11000000,11111011,10000001,10000011,10000011,

可以看到,第二个字段值是2,但传输的是10000011(0000011->3),对于可空字段,解码时需要自行减去1,因为null把10000000占了,传递0需要使用1000001。

问题:如何传递负值?

上述代码运行结果如下:

msg111= -> {123, 1, -2, 3}

outByteStr=11000000,11111011,10000001,11111110,10000011,

可以看到,对于负值是直接传递的,不需要加一或者减一。

2、ASCII字符串

上述代码运行结果如下:

msg111= -> {123, 1, 123, 3}

outByteStr=11000000,11111011,10000001,00110001,00110010,10110011,10000011,

可见对于字符串,数值转换并未有改变。

问题:如何传输null

做如下修改:

Message message = new Message(template);

message.setInteger(1, 1);

//message.setString(2, "123");

message.setInteger(3, 3);

运行结果如下:

msg111= -> {123, 1, null, 3}

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

可见,是通过10000000来传输null值

问题:如何传输空字符串

做如下修改:

Message message = new Message(template);

message.setInteger(1, 1);

message.setString(2, "");

message.setInteger(3, 3);

运行结果如下:

msg111= -> {123, 1, , 3}

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

可见是通过00000000,10000000来传输空字符串。

问题:如何传输\0字符

做如下修改:

Message message = new Message(template);

message.setInteger(1, 1);

message.setString(2, "\0");

message.setInteger(3, 3);

运行结果如下:

msg111= -> {123, 1,  , 3}

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

可见是通过00000000,00000000,10000000来传输\0字符

3、STRING字符串

同ASCII字符串

4、BYTEVECTOR字节向量

上述代码运行结果如下:

msg111= -> {123, 1, 123, 3}

outByteStr=11000000,11111011,10000001,10000100,00110001,00110010,00110011,10000011,

注意这里00000100的值是4,而123字符串的实际长度是3,所以这里需要减去1。

问题:如何传递null

做如下修改:

Message message = new Message(template);

message.setInteger(1, 1);

//message.setByteVector(2, "123".getBytes("GBK"));

message.setInteger(3, 3); 

运行结果如下:

msg111= -> {123, 1, null, 3}

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

当字段不设值时,使用10000000来代表null。

5、DECIMAL浮点数

上述代码运行结果如下:

msg111= -> {123, 1, 0.01, 3}

outByteStr=11000000,11111011,10000001,11111110,10000001,10000011,

可以看到,小数点位数值是-2,没有因为可null属性而需要加一或减一。

问题:如何传递null值

代码修改如下:

Message message = new Message(template);

message.setInteger(1, 1);

//message.setDecimal(2, 0.01);

message.setInteger(3, 3);

运行结果如下:

msg111= -> {123, 1, null, 3}

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

与BYTEVECTOR类似,小数点位数这里传递10000000即代表null,对于无可null属性的浮点数,10000000则表示无小数点。

问题:无小数点如何表现

代码修改如下:

Message message = new Message(template);

message.setInteger(1, 1);

message.setDecimal(2, 2);

message.setInteger(3, 3);

运行结果如下:

msg111= -> {123, 1, 2, 3}

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

可以看到,小数点位数这里值是正数1,因为10000000已经用于表示null了,所以正数都要减去1,实际表明的是无小数点。

四、回顾

总的看来,其实空也是一个需要传递的值,而为了区分空(null)与0,对于正数将全部数值都+1,对于负数则无影响。对于字节向量和浮点数则是在字节向量的长度和小数点位数这里进行区分,字符串则无影响,但需要注意区分null、空字符串、\0字符。

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

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

相关文章

控制各种开环伺服阀放大器

控制不带电气位置反馈模块式伺服阀开环控制,最大电流10mA至1000mA范围可选; 常规可选电流档位:10mA、15mA、20mA、40mA、100mA、300mA等; 前面板电位器或者上位机精细调整零位及增益。 颤振频率以及颤振幅度可选。 快速电流驱…

初入职场六个注意

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 作为一个职场新人,最重要的变化是从学校的学习生活转变进入职场的工作生活,一切都是新鲜的,步入职场就是进入了社会。 其实学校也是一个…

高忆管理:成交量突然放大股价下跌?

在出资股票时,咱们常常看到股票价格急剧跌落,而此时成交量正在暴增。许多出资者进入股市的初期或许会产生困惑,将“成交量忽然扩大股价跌落”视为出资时的一般改变和常态,但其实并不总是如此。这种现象或许暗示着不同的问题和情况…

Qt:界面实时响应鼠标拖动绘制

采用双缓冲实现界面实时响应鼠标的拖动绘制。 思想如下:首先需要两张画布pix和tempPix,他们都是QPixmap实例;pix用来保存初始界面或上一阶段以完成的绘制;tempPix用来作为鼠标拖动时的实时界面绘制;当鼠标左键按下后拖…

C# 生成唯一ID

1.首先通过nuget安装yitter.idgenerator 下面的三行代码搞定

文心一言 VS 讯飞星火 VS chatgpt (83)-- 算法导论8.1 4题

四、用go语言,假设现有一个包含n个元素的待排序序列。该序列由 n/k 个子序列组成,每个子序列包含k个元素。一个给定子序列中的每个元素都小于其后继子序列中的所有元素,且大于其前驱子序列中的每个元素。因此,对于这个长度为 n 的…

C++ | 源码分析 Why double free?

源码分析 Why double free? 文章目录 源码分析 Why double free?WhatWhy1.浅拷贝 VS 深拷贝浅拷贝深拷贝 2.push_back 和 emplace_backpush_back 源码emplace_back 源码 Example HowReference>>>>> 欢迎关注公众号【三戒纪元】 <<<<< What 前…

【爬虫小知识】如何利用爬虫爬网页——python爬虫

前言 网络时代的到来&#xff0c;给我们提供了海量的信息资源&#xff0c;但是&#xff0c;想要获取这些信息&#xff0c;手动一个一个网页进行查找&#xff0c;无疑是一项繁琐且效率低下的工作。这时&#xff0c;爬虫技术的出现&#xff0c;为我们提供了一种高效的方式去获取…

el-form的表单验证,有值却报红!

正确的写法是 el-form中的form用 :model绑定&#xff0c;各个输入项用 v-model绑定值 原因 显然&#xff0c;区别就是 v-model 和 :model的区别 V-mode v-model是一个语法糖&#xff0c;用于 “表单元素上” 实现双向数据绑定。包括数据绑定和事件监听。 <input v-model&q…

Docker技术--Docker简介和架构

1.Docker简介 (1).引入 我们之前学习了EXSI,对于虚拟化技术有所了解,但是我们发现类似于EXSI这样比较传统的虚拟化技术是存在着一定的缺陷:所占用的资源比较多,简单的说,就是你需要给每一个用户提供一个操作平台,这一个操作平台就会占用你的资源。这样资源的浪费是比较多的…

Ansys Zemax | 大功率激光系统的 STOP 分析(五)

大功率激光器广泛用于各种领域当中&#xff0c;例如激光切割、焊接、钻孔等应用中。由于镜头材料的体吸收或表面膜层带来的吸收效应&#xff0c;将导致在光学系统中由于激光能量吸收所产生的影响也显而易见&#xff0c;大功率激光器系统带来的激光能量加热会降低此类光学系统的…

问道管理:逾4600股飘红!汽车板块爆了,多股冲击涨停!

A股商场今天上午全体低开&#xff0c;但其后逐级上行&#xff0c;创业板指数上午收盘大涨超越3%&#xff0c;北向资金也完成净买入38亿元。 别的&#xff0c;A股商场半年报成绩发表如火如荼进行中&#xff0c;多家公司发表半年报后股价应声大涨&#xff0c;部分公司股价冲击涨停…

Docker从认识到实践再到底层原理(一)|技术架构

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

数字孪生:重塑政府决策与公共服务

在之前的文章中为大家分享了数字孪生在很多行业的应用场景&#xff0c;本文和大家一起探讨一下数字孪生在政务管理方面能有哪些应用&#xff0c;以及其对公共服务提供的积极影响。 1&#xff09;城市规划方面 数字孪生技术可用于模拟城市的发展和规划。政府可以建立城市的虚拟…

Promise构造函数,属性以及方法应用

&#xff08;一&#xff09;promise构造函数 <script type"text/javascript">const myPromise new Promise((resolve, reject) > {setTimeout(() > {resolve(foo)},300)})myPromise.then((value) > {console.log(value,value)}).catch((err) > {…

2023蓝帽杯初赛ctf部分题目

Web LovePHP 打开网站环境&#xff0c;发现显示出源码 来可以看到php版本是7.4.33 简单分析了下&#xff0c;主要是道反序列化的题其中发现get传入的参数里有_号是非法字符&#xff0c;如果直接传值传入my_secret.flag&#xff0c;会被php处理掉 绕过 _ 的方法 对于__可以…

蓝牙模块产品认证-国际市场准入准则之加拿大IC认证基础知识

蓝牙模块产品认证-国际市场准入准则之加拿大IC认证基础知识 一&#xff1a;前言加拿大IC介绍 1.1&#xff1a;IC更名 2016年3月加拿大工业部(IC, Industry Canada)正式更名为加拿大创新、科学和经济发展 部(ISED, Innovation, Science and Economic Development Canada) ISED…

客观-【2 线性表】

关键字&#xff1a; 求一阶导数、建立有序单链表时间复杂度、静态链表的指针、链表查找数据x的序号

五、升压电路boost

开关导通时&#xff1a;输入电压对电感充电&#xff0c;形成回路&#xff0c;vi—>电感L—>开关管q&#xff1b; 开关断开时&#xff1a;输入的能量和电感能量一起向负载提供能量&#xff0c;形成回路&#xff0c;Vi—>L—>D—>C—>RL&#xff0c;因此输出电…

R语言APRIORI关联规则、K-MEANS均值聚类分析中药专利复方治疗用药规律网络可视化...

全文链接&#xff1a;http://tecdat.cn/?p30605 应用关联规则、聚类方法等数据挖掘技术分析治疗的中药专利复方组方配伍规律&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 方法检索治疗中药专利复方&#xff0c;排除外用中药及中西药物合用的复方。最近我们…