一种结构化网络数据传输编码方法、设备及介质
文献发布时间:2023-06-19 19:35:22
技术领域
本发明涉及结构化网络数据传输领域,更为具体的,涉及一种结构化网络数据传输编码方法、设备及介质。
背景技术
目前接口传输协议有:XML、JSON以及Google Protocol Buffer。前两种方式,虽然对人类相对友好,但其过程会耗费大量的运算资源,在对运算资源有着苛刻要求的行业,并不适用。
Google Protocol Buffer是近些年Google推出的一种数据传输协议,该技术在使用端仍然沿用对程序员较友好的结构体方式,只是中间传输不再是直接将结构体数据传输过去,或将数据序列化后进行传输,而是采用简单的数据编码。整个数据实际上可以看成压缩编码的序列化,最终实现数据体积变得更小,反序列化速度也很快。目前该技术已被大量使用,但是存在如下技术问题:Google Protocol Buffer的压缩率相对较低,对适用环境的效率与兼容性有待提高。
发明内容
本发明的目的在于克服现有技术的不足,提供一种结构化网络数据传输编码方法、设备及介质,提升了压缩性能以及压缩比,带来序列化与反序列化的快速运行的效果,还节约了传输时带宽资源消耗,可以保障前后版本兼容,使得不必破坏旧数据结构就可以直接对数据结构进行更新,解决了数据格式变化的兼容性问题。
本发明的目的是通过以下方案实现的:
一种结构化网络数据传输编码方法,包括以下步骤:
输入数组数据,所述数组数据包括差值、相同值和特殊值,所述特殊值为-1、1、0;
对照数组数据匹配数据编码规则,如果数组数据为动态数据,则动态数据的存储格式仅存储后续字段编号为递增关系且数据长度一致的数据,并对字段编号采用递增和序号编码;再把1位布尔数据存储为1位,并定义为第一类数据,描述信息占1字节;而其他的定义为第二类数据,描述信息占2字节;除第一类数据、第二类数据之外的动态数据定义为第三类数据;针对第一类数据和第二类数据,采取游程编码;针对第三类数据,采取8位存储结构格式进行编码传输;针对所述字段编号为递增关系且数据长度一致的数据,其存储格式能够存储任何数据,同时每个字段额外增加1个字节作描述;
如果数组数据判断为通用数据,则采用7位存储结构格式进行编码传输。
进一步地,所述特殊值在传输过程中,直接定义为独立数据类型,而不存储原始值。
进一步地,如果所述动态数据长度不一样,则以最长的对齐。
进一步地,所述通用数据如果是固定位,则转换成可兼容的最小长度数据类型。
进一步地,所述通用数据的所有描述信息占据7位,预留一位待用。
进一步地,差值采用如下存储方式:当差值存储比存储原始值占用空间更小时,则存储差值;当差值存储大于等于存储原始值占用空间时,则存储原始值。
进一步地,当数组数据与前一项相同或者是特殊值时,仅采用数据类型标识,无需额外存储。
进一步地,所述通用数据的7位存储结构格式存储定义为:
所述第三类数据的8位存储结构格式存储定义为:
所述第一类数据存储定义为:
所述第二类数据存储定义为:
其中,fieldtype表示字段类型,serialnumbertype表示字段序号类型,datatype表示数据类型,reserved表示预留位,占1位;fieldno表示字段编号,length表示数据长度,data表示实际数据;bittype表示位存类型,fieldnum表示字段数量;sign表示有符号标志,repeat表示数据重复标志,bitlen表示每个字段位长。
一种计算机设备,包括处理器和存储器,在存储器中存储有程序指令,当程序指令被处理器加载运行时执行如上任一所述的结构化网络数据传输编码方法。
一种可读存储介质,包括存储器,在存储器中存储有程序指令,当程序指令被处理器加载运行时执行如上任一所述的结构化网络数据传输编码方法。
本发明的有益效果包括:
(1)本发明提升压缩性能以及压缩比,带来序列化与反序列化的快速运行,节约传输时带宽资源消耗。
(2)本发明通过字段序列号保障前后版本兼容,使得不必破坏旧数据结构就可以直接对数据结构进行更新。
(3)本发明传输中自带数据类型,解析后可匹配任意数据格式,解决数据格式变化的兼容性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例方法的步骤流程图。
具体实施方式
本说明书中所有实施例公开的所有特征,或隐含公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合和/或扩展、替换。
Google Protocol Buffer的压缩率并不达标,如何进一步减少数据存储空间,让压缩率达到极致是一个亟待解决的问题。同时,也存在兼容性问题,例如数据版本兼容、数据类型兼容等。
本发明旨在实现支持更加丰富的数据类型,相比现有方案Google ProtocolBuffer表示的最小单位是1个字节,本发明旨在实现支持多种数据类型传输编码,其中包括:标准数据,如8位整数(有符号和无符号)、16位整数(有符号和无符号)等;非标准数据,如:1位的布尔、2位或多位的枚举数据等,同时本发明能够将大面积相同的数据如何实现更大的压缩比。具体而言,进一步包括通用数据存储和动态数据存储两部分。
一、通用数据存储
本发明中,7位存储结构格式为自命名术语。本发明中通用数据存储格式可以存储任何数据,但每个字段需额外增加1个字节作描述,如果是固定位,则可转换成可兼容的最小长度数据类型。所有描述信息占据7位,暂时预留一位以后待用,具体定义为:
其中,reserved为预留位,占1位,详细定义如下:
1)fieldtype(字段类型)数据占1位,具体定义为:
0:为普通数据格式(通用数据存储)
1:为动态数据格式
2)serialnumbertype(字段序号类型)数据占1位,具体定义为:
0:前一个字段序号加1
1:后面存在字段序号
3)datatype(数据类型)数据占5位,具体定义为:
0:变长无符号整数
1:变长有符号整数
2:char类型
3:unsigned char类型
4:short类型
5:unsigned short类型
6:int类型
7:unsigned int类型
8:int64类型
9:unsigned int64类型
10:float类型
11:double类型
12:char数组,字符串,存在length数据项。
13:unsigned char数组,二进制,存在length数据项。
16:与前一列数据相同,表示无data域部分
17:差值数据(仅针对前后两列都是整数,且差值存储比原值小)
18:自编码字符串数据
19:自编码二进制数据
20:zip编码字符串数据
21:zip编码二进制数据
24:数据值为0
25:数据值为1
26:数据值为-1
4)fieldno(字段编号),按字节存储,采用无符号变长整数的存储格式;
5)length(数据长度),表示data数据所占字节数,仅在字符串、二进制类型有效;
6)data(实际数据),针对固定长度数据时为直接存储,相同时没有数据存在,字符串及二进制固定先存长度然后再存数据,或者编码数据为自带长度。
需要说明的是,使用二进制表示时,16为10000,所以最高位为1时表示为自定义数据类型,最高位为0时,是通用数据类型(0~13),14和15是本发明为以后的其他情况预留的。因此,上述从13到16是正常的。
其中,变长整数和差值存储定义如下:
X为符号位,占一位,表示数的正负,变长有符号整数存储格式为:
0XXX XXXX(1字节):首位为零表示数据为6位(范围为0~63),0后面那位即为数据符号位;
10XX XXXX XXXXXXXX(2字节):开头两位为10即表示数据为13位(范围0 ~ 8191),其中0后面那位即为数据符号位;
110X XXXX XXXXXXXXXXXXXXXX(3字节):开头3位为110即表示数据为20位(范围0~ 1048575),其中0后面那位即为数据符号位;
1110 XXXX XXXXXXXXXXXXXXXXXXXXXXXX(4字节):开头4位为1110即表示数据为27位(范围0 ~ 134217727),其中0后面那位即为数据符号位;
1111 0XXX XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX(5字节):开头5位为11110即表示数据为34位,其中0后面那位即为数据符号位;
1111 10XX XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(6字节):开头6位为1111 10即表示数据为41位,其中0后面那位即为数据符号位;
1111 110X XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(7字节):开头7位为1111 110即表示数据为48位,其中0后面那位即为数据符号位;
1111 1110 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(8字节):开头8位为1111 1110即表示数据为55位,其中0后面那位即为数据符号位;
1111 1111 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(8字节):开头8位为1111 1111即表示数据为63位,其中第二个字节的第一位为数据符号位。
其中,差值及无符号变长整数的存储格式为:
0XXX XXXX(1字节):首位为零表示有效数据为7位;
10XX XXXX XXXXXXXX(2字节):开头两位为10即表示有效数据为14位;
110X XXXX XXXXXXXXXXXXXXXX(3字节):开头3位为110即表示有效数据为21位;
1110 XXXX XXXXXXXXXXXXXXXXXXXXXXXX(4字节):开头4位为1110即表示有效数据为28位;
1111 0XXX XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX(5字节):开头5位为1111 0即表示有效数据为35位;
1111 10XX XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(6字节):开头6位为1111 10即表示有效数据为42位;
1111 110X XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(7字节):开头7位为1111 110即表示有效数据为49位;
1111 1110 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(8字节):开头8位为1111 1110即表示有效数据为56位;
1111 1111 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(9字节):开头8位为1111 1111即表示有效数据为64位。
二、动态数据存储
本发明中,8位存储结构格式为自命名术语。动态数据存储格式仅仅存储后续字段编号为递增关系且数据长度一致的数据,当然如果数据长度不一样可以考虑以最长的对齐。本发明构思中,主要考虑针对特定的1位数据进行了极限优化,空间膨胀不至于太大而不可接受,存储的数据也并非只有自定义位的数据,比如紧挨着的全都是char数据且字段编号也为递增编写,采用本发明方案可以大大节省存储空间,当然对于short甚至int、int64都可以支持。本发明方案把1位布尔数据编码单独独立为第一类数据,描述信息占1字节;而其他的定义为第二类数据和第三类数据,描述信息占2字节,具体定义为:
1)fieldtype(字段类型)数据占1位,必须与前面数据定义必须兼容,具体定义为:
0:为普通数据格式
1:为动态数据格式(动态数据存储)
2)bittype(位存类型)数据占2位
0、1:表示第三类数据
2:表示第一类数据
3:表示第二类数据,自定义存储位长度,数据长度及数据个数等
(1)第三类数据:采用8位存储结构格式进行编码传输,具体定义如下:
1)bittype(位存类型),数据占2位
0:表示所有字段数据均为0
1:表示所有字段数据均为1
2)fieldnum(字段数量),数据占5位,表达1~32的数字,其中0表示为32;
(2)第一类数据:
1)bittype(位存类型),数据占2位
2:表示实际数据存储在后面的data中,且每一个数据占一位;
2)fieldnum(字段数量),数据占5位,表达1~32的数字,其中0表示为32;
3)data数据长度为计算出来的,公式如下:(字段数量+ 7)/ 8
(3)第二类数据:
1)fieldnum(字段数量)数据占5位,表达1~32的数字,其中0表示为32;
2)sign(有符号标志)数据占1位,表示数据是否为有符号,0表示无符号,1表示有符号;
3)repeat(数据重复标志)数据占1位,表示数据是否相同的从父数据,0表示不相同,1表示相同;
4)bitlen(每个字段位长),数据占6位,表达1~64的数字,其中0表示为64,为每一个数据元素占据位数;
5)data(实际数据),存储实际数据
当repeat为1时,数据存储长度:(bitlen + 7)/8;
当repeat为0时,数据存储长度:(bitlen×字段数量+ 7)/8;
上述技术方案中描述了内部数据存储定义,本发明中对整体消息格式定义如下:
1)mark占1字节,固定为字符’W’,算作数据标识;
2)version暂定占1字节,从0开始,表名为协议版本,定义为1;
3)Length与ID定义为变长无符号变长整数。
data为实际数据,其具体长度由Length指定。
由上可见,本发明通过字段序列号保证数据前后版本的兼容,序号采用两种编码方式:递增和序号编码。同时,本发明提供丰富的数据类型,将差值、相同值、特殊值(-1、1、0)等都定义为数据类型。进一步的,利用差值存储:当差值存储比存储原始值占用空间更小时,存储差值;当数据与前一项相同或者是特殊值时,仅仅采用数据类型标识,无需额外存储。本发明还提供了丰富的编码手段,提升数据压缩比,序号是递增且数据一致的数据,采用特殊编码;长度是按位存储的数据,采取游程编码。传输时采用【数据类型+数据值】的格式进行传输,这样无需额外信息进行协助便可自行完成解析,同时解决了不同版本的数据类型兼容问题。
需要说明的是,在本发明权利要求书中所限定的保护范围内,以下实施例均可以从上述具体实施方式中,例如公开的技术原理,公开的技术特征或隐含公开的技术特征等,以合乎逻辑的任何方式进行组合和/或扩展、替换。
实施例1
一种结构化网络数据传输编码方法,如图1所示,包括以下步骤:
输入数组数据,所述数组数据包括差值、相同值和特殊值,所述特殊值为-1、1、0;
对照数组数据匹配数据编码规则,如果数组数据为动态数据,则动态数据的存储格式仅存储后续字段编号为递增关系且数据长度一致的数据,并对字段编号采用递增和序号编码;再把1位布尔数据存储为1位,并定义为第一类数据,描述信息占1字节;而其他的定义为第二类数据,描述信息占2字节;除第一类数据、第二类数据之外的动态数据定义为第三类数据;针对第一类数据和第二类数据,采取游程编码;针对第三类数据,采取8位存储结构格式进行编码传输;针对所述字段编号为递增关系且数据长度一致的数据,其存储格式能够存储任何数据,同时每个字段额外增加1个字节作描述;
如果数组数据判断为通用数据,则采用7位存储结构格式进行编码传输。
实施例2
在实施例1的基础上,所述特殊值在传输过程中,直接定义为独立数据类型,而不存储原始值。
实施例3
在实施例1的基础上,如果所述动态数据长度不一样,则以最长的对齐。
实施例4
在实施例1的基础上,所述通用数据如果是固定位,则转换成可兼容的最小长度数据类型。
实施例5
在实施例1的基础上,所述通用数据的所有描述信息占据7位,预留一位待用。
实施例6
在实施例1的基础上,差值采用如下存储方式:当差值存储比存储原始值占用空间更小时,则存储差值;当差值存储大于等于存储原始值占用空间时,则存储原始值。
实施例7
在实施例2的基础上,当数组数据与前一项相同或者是特殊值时,仅采用数据类型标识,无需额外存储。
实施例8
在实施例2的基础上,所述通用数据的7位存储结构格式存储定义为:
所述第三类数据的8位存储结构格式存储定义为:
所述第一类数据存储定义为:
所述第二类数据存储定义为:
其中,fieldtype表示字段类型,serialnumbertype表示字段序号类型,datatype表示数据类型,reserved表示预留位,占1位;fieldno表示字段编号,length表示数据长度,data表示实际数据;bittype表示位存类型,fieldnum表示字段数量;sign表示有符号标志,repeat表示数据重复标志,bitlen表示每个字段位长。
实施例9
一种计算机设备,包括处理器和存储器,在存储器中存储有程序指令,当程序指令被处理器加载运行时执行如实施例1~实施例8任一所述的结构化网络数据传输编码方法。
实施例10
一种可读存储介质,包括存储器,在存储器中存储有程序指令,当程序指令被处理器加载运行时执行如实施例1~实施例8任一所述的结构化网络数据传输编码方法。
描述于本发明实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现,所描述的单元也可以设置在处理器中。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定。
根据本发明实施例的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各种可选实现方式中提供的方法。
作为另一方面,本发明实施例还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该电子设备执行时,使得该电子设备实现上述实施例中所述的方法。
本发明未涉及部分均与现有技术相同或可采用现有技术加以实现。
上述技术方案只是本发明的一种实施方式,对于本领域内的技术人员而言,在本发明公开了应用方法和原理的基础上,很容易做出各种类型的改进或变形,而不仅限于本发明上述具体实施方式所描述的方法,因此前面描述的方式只是优选的,而并不具有限制性的意义。
除以上实例以外,本领域技术人员根据上述公开内容获得启示或利用相关领域的知识或技术进行改动获得其他实施例,各个实施例的特征可以互换或替换,本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。
- 一种数据传输方法、设备及计算机可读存储介质
- 一种数据传输方法、装置、电子设备及存储介质
- 一种数据传输方法、装置、系统、网络设备及用户设备
- 一种数据传输方法和网络设备以及终端设备
- 一种基于时序数据传输的编码方法和解码方法、装置、电子设备及存储介质
- 一种SDN网络数据传输方法、SDN网络、设备及介质