CN103428192A - 一种封装与解析二进制协议数据的方法和装置 - Google Patents

一种封装与解析二进制协议数据的方法和装置 Download PDF

Info

Publication number
CN103428192A
CN103428192A CN2012101726990A CN201210172699A CN103428192A CN 103428192 A CN103428192 A CN 103428192A CN 2012101726990 A CN2012101726990 A CN 2012101726990A CN 201210172699 A CN201210172699 A CN 201210172699A CN 103428192 A CN103428192 A CN 103428192A
Authority
CN
China
Prior art keywords
data
type
data element
binary protocol
value
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN2012101726990A
Other languages
English (en)
Inventor
杨建禹
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Beijing Co Ltd
Original Assignee
Tencent Technology Beijing Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tencent Technology Beijing Co Ltd filed Critical Tencent Technology Beijing Co Ltd
Priority to CN2012101726990A priority Critical patent/CN103428192A/zh
Publication of CN103428192A publication Critical patent/CN103428192A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种封装与解析二进制协议数据的方法,包括:根据二进制协议数据的结构化数据设置对应的封装配置和解析配置;服务端预先保存封装配置,客户端预先保存解析配置;服务端根据封装配置对二进制协议数据的结构化数据进行封装,得到协议串;客户端根据对应的解析配置对协议串进行解析,得到结构化数据;本发明还公开了一种封装与解析二进制协议数据的装置。通过本发明能够降低二进制协议的实现与维护成本。

Description

一种封装与解析二进制协议数据的方法和装置
技术领域
本发明涉及数据封装和解析技术,特别是指一种封装与解析二进制协议数据的方法和装置。 
背景技术
在网络分布式集群中,通常充斥着各式各样的自定义二进制协议。为了在不同的语言,不同的系统平台上使用这些二进制协议,开发人员不得不针对各种语言及系统平台做出不同的实现。如图1所示,按照传统的实现方式,为了在不同的语言,不同的系统平台上使用多种二进制协议,需要为每一种二进制协议做出单独的实现,如图所示:将每种二进制协议(图中所示为接口)的数据和数据的含义表述信息放到一个信息体中,形成结构化数据,并分别进行C++实现、Java实现、PHP实现和Python实现等,之后,将C++版本的接口、Java版本的接口、PHP版本的接口和Python版本的接口等分别按照该接口中定义的封装方式(定义协议的输入与输出方法中包括了对封装方式的定义)进行封装;在这种传统的实现方式中,不同的接口中定义的封装方式不同、如N个接口中的每个接口定义的封装方式都可能不同。 
由此可见,由于每种接口定义的封装方式不同,导致需要对每种接口、以及每种接口的各个版本单独实现并单独维护,因为网络分布式集群中充斥着各式各样的自定义接口,这样会带来超高的实现与维护成本。 
为了减少成本,部分系统中会尝试使用统一的通用协议来实现。如图2所示,所有接口都使用统一的通用协议来封装各自的C++版本、Java版本、PHP版本和Python版本等。统一的通用协议,例如json、protobuf、thrift等。 
如果采用图1所示的传统的方式来开发一个大型的系统,开发者将面临难 以估量的开发与维护成本。采用图2所示的统一的通用协议是一个降低实现与维护成本的好方法,但是也会存在如下的问题: 
1、统一的通用协议需要将数据含义的表述信息存入结构化数据中,而这部分信息本来只需由客户端与服务端自行约定、不需要放到结构化数据中,统一的通用协议这样的做法将使得协议的体积变得庞大; 
2、为了达到通用的目的,统一的通用协议中需要制订一些规范与约定,这样做会使得协议丧失一定的灵活性; 
3、在大型分布式系统中,通常已存在很多以图1所示的传统方式实现的稳定服务,全部统一成通用协议需要很大的改造成本。 
发明内容
有鉴于此,本发明的主要目的在于提供一种封装与解析二进制协议数据的方法和装置,解决传统实现方式以及统一的通用协议实现方式导致的二进制协议实现与维护成本大、协议体积庞大、协议灵活性低等问题。 
为达到上述目的,本发明的技术方案是这样实现的: 
本发明提供了一种封装与解析二进制协议数据的方法,根据二进制协议数据的结构化数据设置对应的封装配置和解析配置,该方法还包括: 
服务端预先保存封装配置,客户端预先保存解析配置; 
服务端根据所述封装配置对二进制协议数据的结构化数据进行封装,得到协议串; 
客户端根据对应的所述解析配置对所述协议串进行解析,得到所述结构化数据。 
所述结构化数据包括一个或多个数据元素;所述数据元素包括:类型、属性名和值。 
所述数据元素还包括长度。 
所述服务端根据所述封装配置对二进制协议数据的结构化数据进行封装,包括: 
服务端将结构化数据的各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中; 
各数据元素的值在协议串中占用的字节数根据对应的类型或长度确定。 
客户端根据对应的所述解析配置对所述协议串进行解析,包括: 
按照所述解析配置中各信息元的排列顺序、以及各信息元的内容对协议串进行解析,依次得到各信息元对应的数据元素的值。 
数据元素为基本类型数据时,对应的信息元的内容包括:类型和属性名; 
所述基本类型数据的至少包括以下几种:字符型、字符串、整型、布尔型(bool)。 
数据元素为基本类型数据时,对应的信息元的内容还包括:长度。 
数据元素为数组时,对应的信息元的内容包括:类型、属性名、成员的类型和长度; 
所述数组包含一个或多个成员,所有成员为类型相同的基本类型数据; 
长度指示成员的个数,通过解析得到的前一个数据元素的值指定,且前一个数据元素为基本类型数据。。 
数据元素为对象时,对应的信息元的内容包括:类型、属性名、子对象的解析配置和长度; 
所述对象包含一个或多个子对象,每个子对象中包含一个或多个成员,一个成员为一个基本类型数据或一个数组,且各子对象中排列序号相同的成员的类型和属性名相同; 
长度指示子对象的个数,通过解析得到的前一个数据元素的值指定,且前一个数据元素为基本类型数据。 
子对象中的成员为基本类型数据时,在所述子对象的解析配置中对应的子信息元的内容为权利要求6或7所述的信息元的内容; 
子对象中的成员为数组时,在所述子对象的解析配置中对应的子信息元的内容为权利要求8所述的信息元的内容。 
本发明还提供了一种封装与解析二进制协议数据的系统,设置模块、服务 端和客户端,其中: 
所述设置模块,用于根据二进制协议数据的结构化数据设置对应的封装配置和解析配置; 
所述服务端,用于预先保存封装配置,并根据所述封装配置对二进制协议数据的结构化数据进行封装,得到协议串,发送给所述客户端; 
所述客户端,用于预先保存解析配置,并根据对应的所述解析配置对接收所述协议串进行解析,得到所述结构化数据。 
所述服务端,还用于将结构化数据的各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中;各数据元素的值在协议串中占用的字节数根据对应的类型或长度确定。 
所述客户端,还用于按照所述解析配置中各信息元的排列顺序、以及各信息元的内容对协议串进行解析,依次得到各信息元对应的数据元素的值。 
本发明封装与解析二进制协议数据的方法和装置,将封装配置和解析配置均预先在服务端和客户端保存,因此在传递过程中,只需要传递接口本身的数据、即结构化数据即可,这样大大减小了协议的体积。 
由于预先对接口设置了封装配置和解析配置,则在传递接口的结构化数据时,不需要服务端按照某种特定的协议来封装,客户端也不需要按照某种特定的协议来解析,不管该接口是在何种语言、何种系统中使用,只需要按照预先配置的封装配置封装对应版本的接口的结构化数据即可,而客户端也只需要按照预先配置的解析配置文件进行解析,即可得到对应版本的结构化数据。之后,客户端可以直接运行该版本的接口。另外,因为每个接口的结构化数据的不同,上述的封装配置和解析配置只是在接口间有差异,在本接口中,该封装配置和解析配置适用于各种版本(例如C++版本、Java版本、PHP版本、Python版本等)。虽然各接口间的封装配置和解析配置的具体内容不同,但是,封装配置和解析配置所指示的封装方式和解析方式相同。因此,实现和维护比较简单,大大降低了成本。 
附图说明
图1为传统的二进制协议实现方式示意图; 
图2为统一的通用协议的二进制协议实现方式示意图; 
图3为本发明实施例提供的二进制协议实现方式示意图; 
图4为本发明实施例封装与解析二进制协议数据的方法流程示意图。 
具体实施方式
本发明封装与解析二进制协议数据的方案的基本思想如图3所示,针对每种二进制协议(也可称为接口),设置封装配置和解析配置,服务端按照封装配置指示的封装方式将该接口的结构化数据封装为协议串;客户端接收到协议串后,按照解析配置指示的解析方式进行解析后得到结构化数据。 
如图4所示,本发明实施例提供的封装与解析二进制协议数据的方法,包括: 
步骤401,服务端预先保存封装配置,客户端预先保存解析配置。 
本发明中,需要根据二进制协议数据的结构化数据设置对应的封装配置和解析配置,然后,由服务端预先保存封装配置,客户端预先保存解析配置。 
其中,接口的结构化数据即为该接口本身的数据,其可以用二维表结构表示,因此称之为结构化数据。接口的结构化数据包括一个或多个数据元素,其中,每个数据元素包含的项目有:类型、属性名和值;进一步地,数据元素中还可以包括的项固有长度。 
在本接口中,封装配置和解析配置适用于各种版本(例如C++版本、Java版本、PHP版本、Python版本等)。但是,接口间的封装配置和解析配置的具体内容因接口结构化数据的不同而不同,但是,相同类型的结构化数据对应的封装配置和解析配置所指示的封装方式和解析方式所遵循的规则相同。为此,可以将接口的结构化数据至少分为:基本类型数据、数组和对象。 
其中, 
步骤402,服务端根据封装配置对二进制协议数据的结构化数据进行封装,得到协议串。 
具体的,服务端将结构化数据的各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中; 
各数据元素的值在协议串中占用的字节数根据对应的类型或长度确定。 
步骤403,客户端根据对应的解析配置对协议串进行解析,得到结构化数据。 
解析时,按照解析配置中各信息元的排列顺序、以及各信息元的内容对协议串进行解析,依次得到各信息元对应的数据元素的值。 
最后,将数据元素按照解析出的顺序依次填入二维表中,得到结构化数据。 
上述具体的解析和封装过程将通过一下的实施例进行说明。 
实施例一、基本类型数据的封装和解析。 
本发明中,基本类型数据至少包括以下几种类型:字符型、字符串、整型、布尔型(bool)。 
如表1所示为接口的结构化数据,其中包含三个数据元素,这三个数据元素都属于基本类型数据:第1个数据元素的类型为uint8、属性名为a、值为8;第2个数据元素的类型为uint32、属性名为b、值为5;第3个数据元素的类型为string、属性名为c、值为Hello、长度为5个字节。 
  uint8   a   8  
  uint32   b   5  
  string   c   Hello   5
表1 
一、封装过程。 
服务端将该结构化数据的各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中,如表2所示。 
Figure DEST_PATH_GDA00001991263700061
表2 
其中,在协议串中各数据元素的值占用的字节数通过该数据元素的类型确 定或者直接通过该数据元素的长度确定。例如,uint8指示第1个数据元素占用1个字节、uint32指示第2个数据元素占用4个字节;第3个数据元素占用的字节数已经直接给出,即为5个字节。 
二、解析过程。 
客户端接收到如表2所示的协议串后,通过该协议串的包头(表2所示的协议串忽略了包头部分)可以获知其对应的接口,然后查找该接口对应的解析配置,按照该解析配置对协议串进行解析。 
具体的,该解析配置包含的信息元有: 
【uint8,‘a’】(协议串的第1个数据元素的类型为uint8、属性名为a); 
【uint32,‘b’】(协议串的第2个数据元素的类型为uint32、属性名为b); 
【string,‘c’,5】(协议串的第3个数据元素的类型为string、属性名为c、长度为5(字节))。 
由此可见,基本类型数据对应的信息元的内容包括:类型和属性名,进一步地,还可以包括长度。 
解析时,按照解析配置中信息元的排列顺序、以及各信息元的内容对协议串依次进行解析,得到各信息元对应的数据元素的值。 
根据uint8可以确定第1个数据元素占用1个字节,则从表2所示的协议串中取出的第1个字节的值为8,根据解析配置可知,其对应的属性名为a; 
根据uint32可以确定第2个数据元素占用4个字节,则从表2所示的协议串中取出的第2、3、4、5个字节的值为5,根据解析配置可知,其对应的属性名为b; 
根据长度为5确定第三次取出的元素为5个字节,则从表2所示的协议串中取出的第6-10个字节的值为Hello,根据解析配置可知,其对应的属性名为c。 
按照解析出的顺序,将各数据元素(包括类型、值和属性名,如果存在还包括长度)填入一个二维表中,即可得到如表1所示的该接口的结构化数据。 
通过上述的封装和解析过程可知,由于封装配置和解析配置均预先在服务端和客户端保存了,因此在传递过程中,只需要传递接口本身的数据、即结构 化数据即可,这样大大减小了协议的体积。 
由于预先对接口设置了封装配置和解析配置,则在传递接口的结构化数据时,不需要服务端按照某种特定的协议来封装,客户端也不需要按照某种特定的协议来解析,不管该接口是在何种语言、何种系统中使用,只需要按照预先配置的封装配置封装对应版本的接口的结构化数据即可,而客户端也只需要按照预先配置的解析配置文件进行解析,即可得到对应版本的结构化数据。之后,客户端可以直接运行该版本的接口。另外,因为每个接口的结构化数据的不同,上述的封装配置和解析配置只是在接口间有差异,在本接口中,该封装配置和解析配置适用于各种版本(例如C++版本、Java版本、PHP版本、Python版本等)。虽然各接口间的封装配置和解析配置的具体内容不同,但是,封装配置和解析配置所指示的封装方式和解析方式相同。因此,实现和维护比较简单,大大降低了成本。 
实施例二、数组的封装和解析。 
数组包含一个或多个成员,所有成员为类型相同的基本类型数据。如表3所示为接口的结构化数据,该结构化数据的第2个数据元素为array(数组)。数组的长度、即成员的个数通过前一个数据元素的值指定,且前一个数据元素为基本类型数据。 
如表3所示,该结构化数据包括两个数据元素:第1个数据元素为基本类型数据,其类型为uint8、属性名为length、值为6;第2个数据元素为数组,其类型为array,属性名为list,值由6个成员组成(这6个成员的类型为uint16,值分别为5、0、1、9、59、3)。 
Figure DEST_PATH_GDA00001991263700081
表3 
一、封装过程。 
服务端将各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中;封装数组时,具体的:将其各成员的值按照各成员的排列顺序依次封装到协议串中,如表4所示。 
Figure DEST_PATH_GDA00001991263700091
表4 
其中,在协议串中数据元素的值占用的字节数通过数据元素的类型确定或者直接通过数据元素的长度确定。例如,uint8指示第1个数据元素占用1个字节、uint16指示数组的各成员占用2个字节,长度6指示出数组包含6个成员,则数组占用了12个字节。 
二、解析过程。 
客户端接收到如表4所示的协议串后,通过该协议串的包头(表4所示的协议串忽略了包头部分)可以获知其对应的接口,然后查找该接口对应的解析配置,按照该解析配置进行解析。 
具体的,该解析配置包含的信息元依次为: 
【uint8,‘length’】; 
【array,‘list’,uint16,‘length’】。 
其中,【uint8,‘length’】表示协议串的第1个数据元素的类型为uint8、属性名为length); 
【array,‘list’,uint16,‘length’】表示协议串的第2个数据元素的类型为array、属性名为list、该数组包含‘length’个类型为uint16的成员,其中,‘length’即为第1个数据元素的值。 
由此可见,数组对应的信息元的内容包括:类型、属性名、成员的类型和长度。需要指出的是,数据的前一个数据元素必须为基本类型数据,在解析时,通过该基本类型数据的值才能够确定数组的长度,以便对数组进行解析。 
解析时,按照解析配置中信息元的排列顺序、以及各信息元的内容对协议串依次进行解析,得到各信息元对应的数据元素的值。 
第一个信息元:根据uint8可以确定第1个数据元素占用1个字节,则从表4所示的协议串中取出的第1个字节的值为6,根据解析配置可知,其对应的属性名为length;根据第1个数据元素的值6可以确定第2个数据元素的长度为6; 
第二个信息元:根据array、‘list’可以确定第2个数据元素为一个名为list的数组;根据uint16、‘length’可知,该数组中包含了‘length’个类型uint16的成员。其中,‘length’为第1个数据元素的值,为6。由此可以解析出数组的值为:5、0、1、9、59、3,类型均为uint16。 
按照解析出的顺序依次将各数据元素(包括类型、值和属性名,如果存在还包括长度)填入一个二维表中,即可得到如表3所示的结构化数据。 
实施例三、对象的封装和解析。 
对象包含一个或多个子对象,每个子对象中包含一个或多个成员,一个成员为一个基本类型数据或一个数组。其中,对象的长度、即子对象的个数通过前一个数据元素的值指定,且前一个数据元素为基本类型数据。如表5所示为接口的结构化数据,该结构化数据中第2个数据元素为object(对象)。 
如表5所示,该结构化数据包括两个数据元素:第1个数据元素包含的项目有:类型为uint8、属性名为length、值为3;第2个数据元素包含的项目有:类型为object,属性名为list,值由3个子对象组成,每个子对象包含两个成员: 
第1个子对象中:第1个成员的属性名为id、类型为uint16、值为5;第2个成员的属性名为foo、类型为uint8、值为0; 
第2个子对象中:第1个成员属性名为id、类型为uint16、值为1;第2个成员的属性名为foo、类型为uint8、值为9; 
第3个子对象中:第1个成员的属性名为id、类型为uint16、值为59;第2个成员的属性名为foo、类型为uint8、值为3。 
由此可见,各子对象中排列序号相同的成员的类型和属性名相同,值可以不同。 
需要指出的是:第1个数据元素的值指示出了第2个数据元素的长度,在该实施例中,对象的长度即为其包含的子对象的个数。 
Figure DEST_PATH_GDA00001991263700111
表5 
一、封装过程。 
服务端将各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中;封装对象时,具体的:将其各子对象按照各子对象在结构化数据中的排列顺序依次封装到协议串中;进一步地,封装子对象时,将其各成员的值按照各成员在结构化数据中的排列顺序依次封装到协议串中,如表6所示。 
Figure DEST_PATH_GDA00001991263700112
表6 
二、解析过程。 
客户端接收到如表6所示的协议串后,通过该协议串的包头(表6所示的协议串忽略了包头部分)可以获知其对应的接口,然后查找该接口对应的解析配置,按照该解析配置进行解析。 
具体的,该解析配置包含的信息元依次为: 
【uint8,‘length’】; 
【object,‘list’,object_config,‘length’】。 
其中,object_config中还包含了两个子信息元,依次为: 
【uint16,‘id’】; 
【uint8,‘foo’】。 
其中,【uint8,‘length’】表示协议串的第1个数据元素的类型为uint8、属性名为length; 
【object,‘list’,object_config,‘length’】表示协议串的第2个数据元素的 类型为object、即对象、属性名为list、该对象包含‘length’个子对象,各子对象的解析配置为object_config,其中,‘length’即为第1个数据元素的值; 
进一步地,object_config包含的第1个子信息元【uint16,‘id’】表示各个子对象的第1个成员的类型为uint16,属性名为id;第2个子信息元【uint8,‘foo’】表示各个子对象的第2个成员的类型为uint8,属性名为foo。 
由此可见,对象对应的信息元的内容包括:类型、属性名、子对象的解析配置和长度;子对象中的成员为基本类型数据时,在子对象的解析配置中对应的子信息元的内容与实施例一所示的基本类型数据的信息元的内容相同;子对象中的成员为数组时,在子对象的解析配置中对应的子信息元的内容与实施例二所示的数组的信息元的内容相同。 
需要指出的是,对象的前一个数据元素必须为基本类型数据,在解析时,通过该基本类型数据的值才能够确定对象的长度,以便对对象进行解析。进一步地,若子对象的成员中存在数组,则数组的前一个成员必定为基本类型数据,通过其值来指示数组的长度。 
解析时,按照解析配置中信息元的排列顺序(包括子信息元的排列顺序)、以及各信息元(包括各子信息元)的内容对协议串依次进行解析,得到各信息元对应的数据元素的值。 
第一个信息元:根据uint8可以确定第1个数据元素占用1个字节,则从表6所示的协议串中取出的第1个字节的值为3,根据解析配置可知,其对应的属性名为length;根据第1个数据元素的值3可以确定第2个数据元素的长度为3; 
第二个信息元:根据object,‘list’可以确定第2个数据元素为一个名为list的对象;根据object_config,‘length’可知,该对象中包含了‘length’个子对象、且各子对象的解析配置为object_config。其中,‘length’为第1个数据元素的值为6。 
进一步,根据object_config包含的第1个子信息元【uint16,‘id’】和第2个【uint8,‘foo’】可以确定,各子对象包含的第1个成员占用2个字节,属性名为id,第2个成员占用1个字节,属性名为foo。 
由此可以解析出对象包含的3个子对象依次为: 
(uint16,5;uint8,0); 
(uint16,1;uint8,9); 
(uint16,59;uint8,3)。 
按照解析出的顺序依次将各数据元素(包括类型、值和属性名,如果存在还包括长度)填入一个二维表中,即可得到如表5所示的结构化数据。 
基于上述的实施例,本发明还提供了一种扩展实施例、即实施例四,条件的解析和封装。 
在结构化数据中,条件的值为设定的值,根据条件的值可以确定后续数据元素的封装配置和解析配置。在本发明中,后续数据元素的封装配置和解析配置有两种:一是基本类型数据的封装配置和解析配置;一种是数组的封装配置和解析配置。 
该实施例中,假设,条件的值为0或1,类型为uint8,属性名为errno。 
那么,当条件的值为0时,表示后续数据元素的封装方式和解析方式与数组的封装方式和解析方式相同; 
当第1个数据元素的值为1时,表示后续数据元素的封装方式和解析方式与基本类型数据的封装方式和解析方式相同。 
当然,还可以通过其他方式来设置第1个数据元素的值与封装和解析方式的对应关系。 
如表7和表8所示为两种接口的结构化数据。 
Figure DEST_PATH_GDA00001991263700131
表7 
  uint8   errno   1  
  uint8   length   12  
  string   errno   errors found   12
表8 
其中,表7所示的结构化数据中第1个数据元素类型为uint8、属性名为errno、值为0,表示后续的数据元素按照数组的封装方式进行封装; 
表8所示的结构化数据中第1个数据元素类型为uint8、属性名为errno、值为1,表示后续的数据元素按照基本类型数据的封装方式进行封装。 
一、封装过程。 
服务端将该结构化数据的各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中。 
对于表7的结构化数据,先将第1个数据元素的值0进行封装,然后按照实施例二所示的数组的封装方式来依次封装后续的第2和第3个数据元素(其中,第3个数据元素为数组,第2个数据元素为基本类型数据,其值用来指示数组的长度),得到如表9所示的协议串。 
Figure DEST_PATH_GDA00001991263700141
表9 
其中,按照数组的封装方式,第2个数据元素的值3即为第3个数据元素即数组的长度,包含3个基本类型数据,进一步根据基本类型数据的类型uint16,可以确定数组的长度为6个字节。 
对于表8的结构化数据,先将第1个数据元素的值1进行封装,然后按照实施例一所示的基本类型数据的封装方式来依次封装后续的第2和第3个数据元素,得到如表10所示的协议串。 
表10 
其中,按照基本类型数据的封装方式,在协议串中各数据元素的值占用的字节数通过该数据元素的类型确定或者直接通过该数据元素的长度确定。例如,uint8指示第2个数据元素占用1个字节;第3个数据元素占用的字节数已经直接给出,即为12个字节。 
二、解析过程。 
客户端接收到如表9和表10所示的协议串后,通过协议串的包头(表9 所示的协议串忽略了包头部分)可以获知其对应的接口,然后查找该接口对应的解析配置,按照该解析配置对协议串进行解析。 
为了节省空间,可以将多个条件的解析配置进行合并,条件的解析配置包含的信息元为:【cond,‘errno’,cond_config】,其中cond,‘errno’表示协议串中待解析的第1个数据元素为一个条件,属性名为errno,解析出的第1个数据元素的值决定后续数据元素的解析方式。进一步地,cond_config描述了第1个数据元素的值和子解析配置的对应关系,该实施例中为: 
0=>good_config,表示如果第1个数据元素的值为0时,依据good_config描述的子解析配置进行解析; 
1=>fail_config,表示如果第1个数据元素的值为1时,根据fail_config描述的子解析配置进行解析。 
对于表9所示的协议串,先解析出第1个数据元素的值为0;然后按照good_config描述的子解析配置进行解析;该实施例中,good_config描述的子解析配置与实施例二的数组的解析配置类似,此处不再赘述。根据good_config描述的子解析配置进行解析,可依次得到第2个和第3个数据元素的值。最后,按照解析出的顺序依次将3个数据元素填入一个二维表中,即可得到表7所示的结构化数据。 
对于表10所示的协议串,先解析出第1个数据元素的值为1;然后按照fail_config描述的子解析配置进行解析;该实施例中,fail_config描述的子解析配置与实施例一的基本类型数据的解析配置类似,此处不再赘述。根据fail_config描述的子解析配置进行解析,可依次得到第2个和第3个数据元素的值。最后,按照解析出的顺序依次将3个数据元素填入一个二维表中,即可得到表8所示的结构化数据。 
为了实现上述方法,本发明还提供了一种封装与解析二进制协议数据的系统,包括:设置模块、服务端和客户端,其中: 
设置模块,用于根据二进制协议数据的结构化数据设置对应的封装配置和解析配置; 
服务端,用于预先保存封装配置,并根据封装配置对二进制协议数据的结构化数据进行封装,得到协议串,发送给客户端; 
客户端,用于预先保存解析配置,并根据对应的解析配置对接收协议串进行解析,得到结构化数据。 
进一步地,服务端,还用于将结构化数据的各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中;各数据元素的值在协议串中占用的字节数根据对应的类型或长度确定。 
进一步地,客户端,还用于按照解析配置中各信息元的排列顺序、以及各信息元的内容对协议串进行解析,依次得到各信息元对应的数据元素的值。 
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。 

Claims (13)

1.一种封装与解析二进制协议数据的方法,其特征在于,根据二进制协议数据的结构化数据设置对应的封装配置和解析配置,该方法还包括:
服务端预先保存封装配置,客户端预先保存解析配置;
服务端根据所述封装配置对二进制协议数据的结构化数据进行封装,得到协议串;
客户端根据对应的所述解析配置对所述协议串进行解析,得到所述结构化数据。
2.根据权利要求1所述封装与解析二进制协议数据的方法,其特征在于,所述结构化数据包括一个或多个数据元素;所述数据元素包括:类型、属性名和值。
3.根据权利要求2所述封装与解析二进制协议数据的方法,其特征在于,所述数据元素还包括长度。
4.根据权利要求3所述封装与解析二进制协议数据的方法,其特征在于,所述服务端根据所述封装配置对二进制协议数据的结构化数据进行封装,包括:
服务端将结构化数据的各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中;
各数据元素的值在协议串中占用的字节数根据对应的类型或长度确定。
5.根据权利要求4所述封装与解析二进制协议数据的方法,其特征在于,客户端根据对应的所述解析配置对所述协议串进行解析,包括:
按照所述解析配置中各信息元的排列顺序、以及各信息元的内容对协议串进行解析,依次得到各信息元对应的数据元素的值。
6.根据权利要求5所述封装与解析二进制协议数据的方法,其特征在于,
数据元素为基本类型数据时,对应的信息元的内容包括:类型和属性名;
所述基本类型数据的至少包括以下几种:字符型、字符串、整型、布尔型(bool)。
7.根据权利要求6所述封装与解析二进制协议数据的方法,其特征在于,
数据元素为基本类型数据时,对应的信息元的内容还包括:长度。
8.根据权利要求5所述封装与解析二进制协议数据的方法,其特征在于,
数据元素为数组时,对应的信息元的内容包括:类型、属性名、成员的类型和长度;
所述数组包含一个或多个成员,所有成员为类型相同的基本类型数据;
长度指示成员的个数,通过解析得到的前一个数据元素的值指定,且前一个数据元素为基本类型数据。
9.根据权利要求5所述封装与解析二进制协议数据的方法,其特征在于,
数据元素为对象时,对应的信息元的内容包括:类型、属性名、子对象的解析配置和长度;
所述对象包含一个或多个子对象,每个子对象中包含一个或多个成员,一个成员为一个基本类型数据或一个数组,且各子对象中排列序号相同的成员的类型和属性名相同;
长度指示子对象的个数,通过解析得到的前一个数据元素的值指定,且前一个数据元素为基本类型数据。
10.根据权利要求9所述封装与解析二进制协议数据的方法,其特征在于,
子对象中的成员为基本类型数据时,在所述子对象的解析配置中对应的子信息元的内容为权利要求6或7所述的信息元的内容;
子对象中的成员为数组时,在所述子对象的解析配置中对应的子信息元的内容为权利要求8所述的信息元的内容。
11.一种封装与解析二进制协议数据的系统,其特征在于,设置模块、服务端和客户端,其中:
所述设置模块,用于根据二进制协议数据的结构化数据设置对应的封装配置和解析配置;
所述服务端,用于预先保存封装配置,并根据所述封装配置对二进制协议数据的结构化数据进行封装,得到协议串,发送给所述客户端;
所述客户端,用于预先保存解析配置,并根据对应的所述解析配置对接收所述协议串进行解析,得到所述结构化数据。
12.根据权利要求11所述封装与解析二进制协议数据的系统,其特征在于,
所述服务端,还用于将结构化数据的各数据元素的值按照各数据元素在结构化数据中的排列顺序依次封装到协议串中;各数据元素的值在协议串中占用的字节数根据对应的类型或长度确定。
13.根据权利要求11所述封装与解析二进制协议数据的系统,其特征在于,
所述客户端,还用于按照所述解析配置中各信息元的排列顺序、以及各信息元的内容对协议串进行解析,依次得到各信息元对应的数据元素的值。
CN2012101726990A 2012-05-25 2012-05-25 一种封装与解析二进制协议数据的方法和装置 Pending CN103428192A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2012101726990A CN103428192A (zh) 2012-05-25 2012-05-25 一种封装与解析二进制协议数据的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2012101726990A CN103428192A (zh) 2012-05-25 2012-05-25 一种封装与解析二进制协议数据的方法和装置

Publications (1)

Publication Number Publication Date
CN103428192A true CN103428192A (zh) 2013-12-04

Family

ID=49652373

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2012101726990A Pending CN103428192A (zh) 2012-05-25 2012-05-25 一种封装与解析二进制协议数据的方法和装置

Country Status (1)

Country Link
CN (1) CN103428192A (zh)

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103699633A (zh) * 2013-12-23 2014-04-02 Tcl集团股份有限公司 一种利用xml实现通用化数据交换的方法和系统
CN103973450A (zh) * 2014-04-24 2014-08-06 广东华邦技术软件有限公司 一种通信方法、系统及终端设备
CN105306478A (zh) * 2015-11-11 2016-02-03 上海熙菱信息技术有限公司 Http协议数据规格化的系统及方法
CN105868364A (zh) * 2016-03-29 2016-08-17 中国电子科技集团公司第二十八研究所 一种基于字节流的结构化数据表示方法
CN108429764A (zh) * 2018-05-28 2018-08-21 烽火通信科技股份有限公司 一种基于私有协议的数据传输和解析的方法
CN108768715A (zh) * 2018-05-22 2018-11-06 烽火通信科技股份有限公司 接入网管的业务配置适配方法及系统
CN109474643A (zh) * 2019-01-14 2019-03-15 广州虎牙信息科技有限公司 数据解析方法、装置、设备及存储介质
CN109981676A (zh) * 2019-04-08 2019-07-05 陈鹏 一种基于二进制解析协议自定义的物联网信息交互方法
CN110138755A (zh) * 2019-04-30 2019-08-16 广东侍卫长北斗科技股份公司 一种多协议北斗数据采集的网关通信交互服务方法
CN111741072A (zh) * 2020-05-27 2020-10-02 清华大学 基于设备虚拟化的低带宽高安全性的数据传输方法
CN112822090A (zh) * 2019-11-15 2021-05-18 北京新媒传信科技有限公司 一种适用于移动终端的即时通信工具的通信方法、装置和系统

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1700665A (zh) * 2004-05-21 2005-11-23 安捷伦科技有限公司 分布式数据模型
CN101309488A (zh) * 2008-07-14 2008-11-19 青岛海信移动通信技术股份有限公司 一种双模终端及其数据业务中发送和接收数据的方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1700665A (zh) * 2004-05-21 2005-11-23 安捷伦科技有限公司 分布式数据模型
CN101309488A (zh) * 2008-07-14 2008-11-19 青岛海信移动通信技术股份有限公司 一种双模终端及其数据业务中发送和接收数据的方法

Cited By (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103699633A (zh) * 2013-12-23 2014-04-02 Tcl集团股份有限公司 一种利用xml实现通用化数据交换的方法和系统
CN103973450A (zh) * 2014-04-24 2014-08-06 广东华邦技术软件有限公司 一种通信方法、系统及终端设备
CN103973450B (zh) * 2014-04-24 2017-07-11 广东华邦云计算股份有限公司 一种通信方法、系统及终端设备
CN105306478A (zh) * 2015-11-11 2016-02-03 上海熙菱信息技术有限公司 Http协议数据规格化的系统及方法
CN105868364B (zh) * 2016-03-29 2020-06-12 中国电子科技集团公司第二十八研究所 一种基于字节流的结构化数据表示方法
CN105868364A (zh) * 2016-03-29 2016-08-17 中国电子科技集团公司第二十八研究所 一种基于字节流的结构化数据表示方法
CN108768715A (zh) * 2018-05-22 2018-11-06 烽火通信科技股份有限公司 接入网管的业务配置适配方法及系统
CN108429764B (zh) * 2018-05-28 2021-03-30 烽火通信科技股份有限公司 一种基于私有协议的数据传输和解析的方法
CN108429764A (zh) * 2018-05-28 2018-08-21 烽火通信科技股份有限公司 一种基于私有协议的数据传输和解析的方法
CN109474643A (zh) * 2019-01-14 2019-03-15 广州虎牙信息科技有限公司 数据解析方法、装置、设备及存储介质
CN109981676A (zh) * 2019-04-08 2019-07-05 陈鹏 一种基于二进制解析协议自定义的物联网信息交互方法
CN110138755A (zh) * 2019-04-30 2019-08-16 广东侍卫长北斗科技股份公司 一种多协议北斗数据采集的网关通信交互服务方法
CN112822090A (zh) * 2019-11-15 2021-05-18 北京新媒传信科技有限公司 一种适用于移动终端的即时通信工具的通信方法、装置和系统
CN112822090B (zh) * 2019-11-15 2023-03-31 北京新媒传信科技有限公司 一种适用于移动终端的即时通信工具的通信方法、装置和系统
CN111741072A (zh) * 2020-05-27 2020-10-02 清华大学 基于设备虚拟化的低带宽高安全性的数据传输方法
CN111741072B (zh) * 2020-05-27 2021-10-12 清华大学 基于设备虚拟化的低带宽高安全性的数据传输方法

Similar Documents

Publication Publication Date Title
CN103428192A (zh) 一种封装与解析二进制协议数据的方法和装置
US11526531B2 (en) Dynamic field data translation to support high performance stream data processing
CA2917824C (en) Parser generation
CN107885499A (zh) 一种接口文档生成方法及终端设备
CN104331315B (zh) 一种任意层次json对象的解析与生成方法及系统
CN101620636B (zh) 一种显示表格数据的方法和装置
CN111683066B (zh) 异构系统集成方法、装置、计算机设备和存储介质
CN101101602A (zh) 一种数据格式的校验方法及装置
CN104572895A (zh) MPP数据库与Hadoop集群数据互通方法、工具及实现方法
CN108829884A (zh) 数据映射方法及装置
CN105868364B (zh) 一种基于字节流的结构化数据表示方法
Zunke et al. Json vs xml: A comparative performance analysis of data exchange formats
US20070143330A1 (en) Processing an XML schema
CN103019874A (zh) 基于数据同步实现异常处理的方法及装置
CN104991810B (zh) 自动添加apk到安卓系统中的方法及处理系统
CN104820604A (zh) 一种应用于pos终端的浏览器
CN112069176A (zh) 一种通讯协议的数据库设计方法、装置、设备和存储介质
Sanchez et al. Bigraphical modelling of architectural patterns
CN105516106A (zh) 报文的组包方法及装置、报文的解包方法及装置
CN109471878A (zh) 一种变电站远动机自动比对系统
CN105389180A (zh) 一种基于Android平台的USB端口可配置化方法
CN102736552A (zh) 一种应用于plc开发的梯形图转换为语句表的方法
CN105512350A (zh) 一种网站多级内容管理方法及装置
CN102314371A (zh) 基于可扩展标记语言的编码方法、解码方法及编解码装置
CN109960553A (zh) 一种多视窗内容呈现方法与系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication

Application publication date: 20131204

RJ01 Rejection of invention patent application after publication