解析通信协议的方法、存储介质、设备及系统与流程

文档序号:16062163发布日期:2018-11-24 12:18阅读:207来源:国知局

本发明涉及通信协议解析技术领域,具体来讲是一种解析通信协议的方法、存储介质、设备及系统。

背景技术

在模块间的通信过程中除了需要有通信总线以外,还需要一套能够兼容多种使用用途的通信协议。通信协议的设计是通信算法根据信息交流的时候所遵循的标准来设计的。

目前,业内设计有各种通用通信协议。但是,现有的各种通用通信协议依然存在以下缺陷:一般的通用通信协议由于过多的考虑到通用性,会存在许多无用字段的设计,使得通用通信协议的整体内容比较臃肿庞大。臃肿庞大的通信协议体会占据较大的内存和信道范围,不利于模块间的数据传输,从而导致传输效率低,并且臃肿庞大的通信协议还会影响后期开发人员对协议的理解。而现有的轻量级通用通信协议又可能由于字段设计不足或通用性不强,而无法满足各类型模块间消息传输的需求,从而无法正常使用。

为此,业内设计出了新的通信协议。这种新的通信协议包括协议头和协议体,协议头与协议体之间通过协议分隔符(如,)隔开。协议头的前部为协议头标识符(如@head:),后部为用于描述协议体的若干字段信息,该字段信息以键值对(key=value)的形式表示,且每个键值对的前面以及最后一个键值对的后面具有键值对标识符(如@)。协议体包含数据类型和数据内容两部分,数据类型的前部为数据类型标识符(如@t=),后部为类型信息;数据内容的前部为数据内容标识符(如@d:),后部为若干条数据信息,该数据信息以键值对(key=value)的形式表示,且每个键值对的前面以及最后一个键值对的后面均添加有单字节的键值对标识符(如@)。举例来说,一条按照上述新的通信协议发送的完整信息的展现形式如下:

{@head:@charset=utf8@length=10@type=user_define@sender=modela@receiver=modelb@md5_length=10@md5=ss@send_data_time=101010@aes=true@,@t=user_define@d:@key1=value1@key2=value2@key3=value3@key4=value4@}

利用新的通信协议进行通信时,传输效率更高,而且能满足各类型模块间消息传输的需求,从而达到高性能通信的目的。但是,新的通信协议在实际解析时却存在着一些难题:传统的通信协议解析方案并不能很好的适用于新的通信协议,要么由于匹配度不高而使得解析效率低,要么由于无法匹配而根本无法实现解析。因此,如何设计出适用于新的通信协议的解析方案是本领域技术人员亟待解决的问题。



技术实现要素:

本发明的目的是为了克服上述背景技术的不足,提供一种解析通信协议的方法、存储介质、设备及系统,不但能适用于新的通信协议的解析,而且解析效率高。

为达到以上目的,本发明采取的技术方案是:提供一种解析通信协议的方法,该方法包括以下步骤:

s1、协议的拆分:根据协议头与协议体之间的协议分隔符,将通信协议拆分成协议头部分和协议体部分;并将协议头部分的信息存储至一个协议头字符串变量中,将协议体部分的信息存储至一个协议体字符串变量中;

s2、协议头的解析:将协议头字符串变量中的协议头标识符去除;根据键值对标识符将协议头字符串变量中剩余的信息分割,得到每个协议头字段信息对应的键值对信息;根据每个键值对信息中的键和值的信息,得到对应的协议头字段信息的内容;

s3、协议体的解析:根据数据内容标识符将协议体字符串变量中的内容拆分成数据类型部分和数据内容部分;将数据类型部分中的数据类型标识符去除,得到数据类型的信息;根据键值对标识符将数据内容部分分割,得到每条数据对应的键值对信息;根据每个键值对信息中的键和值的信息,得到对应的每条数据的内容。

在上述技术方案的基础上,步骤s1具体包括以下操作:

步骤s101、将通信协议的所有内容赋值于一个协议字符串变量中;并创建一个用于定位协议分隔符的位置的游标变量;

步骤s102、从协议字符串变量的首字符开始,按照每次取出与协议分隔符长度相同的字符串的方式循环取出协议字符串变量中的字符串;每次取出字符串后,将取出的字符串与协议分隔符进行匹配,若匹配失败,则从协议字符串变量的下一个字符开始继续循环取出字符串,并将当前游标变量的值加1;若匹配成功,则保存当前游标变量的值;

步骤s103、根据保存的游标变量的值,从协议字符串变量中截取出协议头部分的字符串并存储至协议头字符串变量中;从协议字符串变量中截取出协议体部分的字符串并存储至协议体字符串变量中。

在上述技术方案的基础上,步骤s2具体包括以下操作:

步骤s201、将协议头字符串变量中的协议头标识符去除;并将去除后的剩余内容存储至一个协议头内容字符串变量中;

步骤s202、创建一个用于存放键值对标识符的位置信息的游标集合;

步骤s203、从协议头内容字符串变量的首字符开始,按照每次取出与键值对标识符长度相同的字符串的方式循环取出协议头内容字符串变量中的字符串;每次取出字符串后,将取出的字符串与键值对标识符进行匹配,若匹配失败,则从协议头内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;若匹配成功,则将当前的位置信息记录到所述游标集合中,再从协议头内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;如此循环,直至协议头内容字符串变量中的所有内容遍历完全;

步骤s204、根据当前游标集合中所有的相邻的两条位置信息,从协议头内容字符串变量中截取出所有的协议头字段信息对应的键值对信息;

步骤s205、根据截取出的每个键值对信息中的键和值的信息,得到对应的协议头字段信息的内容。

本发明还提供一种存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述解析通信协议的方法的步骤。

本发明还提供一种解析通信协议的设备,包括存储器、处理器及存储在存储器上并在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述解析通信协议的方法的步骤。

本发明还提供一种解析通信协议的系统,该系统包括顺次相连的协议拆分模块、协议头解析模块和协议体解析模块;

所述协议拆分模块用于:根据协议头与协议体之间的协议分隔符,将通信协议拆分成协议头部分和协议体部分;并将协议头部分的信息存储至一个协议头字符串变量中,将协议体部分的信息存储至一个协议体字符串变量中;

所述协议头解析模块用于:将协议头字符串变量中的协议头标识符去除;根据键值对标识符将协议头字符串变量中剩余的信息分割,得到每个协议头字段信息对应的键值对信息;根据每个键值对信息中的键和值的信息,得到对应的协议头字段信息的内容;

所述协议体解析模块用于:根据数据内容标识符将协议体字符串变量中的内容拆分成数据类型部分和数据内容部分;将数据类型部分中的数据类型标识符去除,得到数据类型的信息;根据键值对标识符将数据内容部分分割,得到每条数据对应的键值对信息;根据每个键值对信息中的键和值的信息,得到对应的每条数据的内容。

在上述技术方案的基础上,所述协议拆分模块包括初始设置子模块、协议分隔符定位子模块、协议头及协议体截取子模块;

所述初始设置子模块用于:将通信协议的所有内容赋值于一个协议字符串变量中;并创建一个用于定位协议分隔符的位置的游标变量;

所述协议分隔符定位子模块用于:从协议字符串变量的首字符开始,按照每次取出与协议分隔符长度相同的字符串的方式循环取出协议字符串变量中的字符串;每次取出字符串后,将取出的字符串与协议分隔符进行匹配,若匹配失败,则从协议字符串变量的下一个字符开始继续循环取出字符串,并将当前游标变量的值加1;若匹配成功,则保存当前游标变量的值;

所述协议头及协议体截取子模块用于:根据所述协议分隔符定位子模块保存的游标变量的值,从协议字符串变量中截取出协议头部分的字符串并存储至协议头字符串变量中,从协议字符串变量中截取出协议体部分的字符串并存储至协议体字符串变量中。

在上述技术方案的基础上,所述协议头解析模块包括协议头标识符去除子模块、游标集合创建子模块、键值对标识符定位子模块、键值对信息截取子模块、协议头字段信息获取子模块;

所述协议头标识符去除子模块用于:将协议头字符串变量中的协议头标识符去除;并将去除后的剩余内容存储至一个协议头内容字符串变量中;

所述游标集合创建子模块用于:创建一个用于存放键值对标识符的位置信息的游标集合;

所述键值对标识符定位子模块用于:从协议头内容字符串变量的首字符开始,按照每次取出与键值对标识符长度相同的字符串的方式循环取出协议头内容字符串变量中的字符串;每次取出字符串后,将取出的字符串与键值对标识符进行匹配,若匹配失败,则从协议头内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;若匹配成功,则将当前的位置信息记录到所述游标集合中,再从协议头内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;如此循环,直至协议头内容字符串变量中的所有内容遍历完全;

所述键值对信息截取子模块用于:根据当前游标集合中所有的相邻的两条位置信息,从协议头内容字符串变量中截取出所有的协议头字段信息对应的键值对信息;

所述协议头字段信息获取子模块用于:根据截取出的每个键值对信息中的键和值的信息,得到对应的协议头字段信息的内容。

在上述技术方案的基础上,所述协议头解析模块还包括协议头校验子模块,该协议头校验子模块用于:判断协议头部分是否是以协议头标识符为开头,若不是,则终止解析操作,提示解析出错并给出协议头信息异常的消息。

在上述技术方案的基础上,所述协议头字段信息中包括数据类型的字段信息;所述协议体解析模块还用于:在得到数据类型的信息后,将得到的数据类型的信息与协议头字段信息中包含的数据类型的字段信息进行比对,判断两者是否相同;若不相同,则终止解析操作,提示解析出错并给出协议体内容错误的消息。

本发明的有益效果在于:

(1)本发明中,先根据协议分隔符将通信协议拆分成协议头部分和协议体部分;然后,根据键值对标识符截取出协议头部分中的键值对信息,并对该键值对信息进行解析得到对应的协议头字段信息的内容,从而完成协议头的解析;最后,根据数据类型标识符、数据内容标识符以及键值对标识符,并通过一系列解析处理,得到协议体的数据内容中每条数据的内容,从而完成协议体的解析。整个解析过程都是针对新的通信协议的特有结构所专门设计的,利用了通信协议中特定的协议分隔符、协议头标识符、数据类型标识符、数据内容标识符以及键值对标识符等,实现了通信协议的解析,不但能很好的适用于新的通信协议,匹配度极高,而且解析效率高。

(2)本发明中,在进行协议的拆分、协议头内容的拆分、以及协议体内容的拆分时,均是将相应的内容赋值给了一个字符串变量,这样就可以将相应的内容拆分工作转变成对字符串中内容的截取工作,利于拆分的实现。

(3)本发明中,在解析协议头、协议体时,还会对协议头、协议体进行校验操作,保障了协议头、协议体解析的有效性,确保了解析操作能准确、有效地执行。

附图说明

图1为本发明实施例中解析通信协议的方法的流程图;

图2为本发明实施例中解析通信协议的设备的结构示意图;

图3为本发明实施例中解析通信协议的系统的结构框图;

图4为本发明实施例中协议拆分模块的具体结构示意图;

图5为本发明实施例中协议头解析模块的具体结构示意图;

图6为本发明实施例中协议体解析模块的具体结构示意图。

具体实施方式

下面结合附图及具体实施例对本发明作进一步的详细描述。

参见图1所示,本发明实施例提供一种解析通信协议的方法,该方法包括以下步骤:

步骤s1、协议的拆分:根据协议头与协议体之间的协议分隔符(如,),将通信协议拆分成协议头部分(如@head:@charset=utf8@length=10@type=user_define@sender=modela@receiver=modelb@md5_length=10@md5=ss@send_data_time=101010@aes=true@)和协议体部分(如@t=user_define@d:@key1=value1@key2=value2@key3=value3@key4=value4@);并将协议头部分的信息存储至一个协议头字符串变量(如head变量)中,将协议体部分的信息存储至一个协议体字符串变量(如body变量)中。

该步骤的原理为:在解析协议内容之前,我们首先需要将协议进行拆分,拆分成两大块,其一是拆分出协议头部分,其二是拆分出协议体部分。由于新的通信协议在协议头和协议体交接处使用了协议分隔符(如,),因此我们可以通过查找该协议分隔符,来对通信协议进行信息的拆分工作。

在一种实施方式中,步骤s1具体包括以下流程:

步骤s101、将通信协议的所有内容赋值于一个协议字符串变量(如allcontent变量)中;并创建一个游标变量(如index),用于定位协议分隔符的位置。

可以理解的是,本步骤将整个通信协议的内容赋值给了一个字符串变量,这样就可以将协议的拆分工作转变成对字符串中内容的拆分工作,利于拆分的实现。另外,为了定位协议分隔符的位置,本步骤中创建了一个游标变量,在后续的协议分隔符的循环遍历查找过程中,通过该游标变量能方便记录整个遍历定位过程中的游标位置信息,从而定位到协议分隔符的位置。

步骤s102、从协议字符串变量的首字符开始,按照每次取出与协议分隔符长度相同的字符串的方式循环取出协议字符串变量中的字符串;每次取出字符串后,将取出的字符串与协议分隔符进行匹配,若匹配失败,说明取出来的字符串不是协议分隔符,即未找到协议分隔符,则从协议字符串变量的下一个字符开始继续循环取出字符串,并将当前游标变量的值加1;若匹配成功,说明已查找定位到了协议分隔符,保存当前游标变量的值。可以理解的是,当前游标变量的值就是需要截取的协议头部分的字符串长度信息。

以协议分隔符为“,”为例,对步骤s102进行举例说明。由于协议分隔符“,”仅有一个字符,因此操作时,从协议字符串变量的首字符开始,按照每次取出一个字符的方式循环取出协议字符串变量中的字符;每次取出一个字符后,将取出的该字符与“,”进行匹配看是否是“,”,若匹配失败,从协议字符串变量的下一个字符开始继续循环取出一个字符,并将当前游标变量的值加1;若匹配成功,则保存当前游标变量的值。

另外,步骤s102中,在将取出的字符串与协议分隔符进行匹配时,可通过调用现有的字符串匹配函数equals来实现。

步骤s103、根据保存的游标变量的值,从协议字符串变量中截取出协议头部分的字符串并存储至协议头字符串变量(如head变量)中;从协议字符串变量中截取出协议体部分的字符串并存储至协议体字符串变量(如body变量)中。

在具体实现的时候,可以通过调用字符串截取函数substring()来截取协议字符串变量中的协议头部分的字符串。其实现方式为:substring(0,index),其中substring函数中的第一个参数是截取字符串的起始位置,第二个参数是截取字符串的结束位置,通过substring传入0和游标变量的值index,就能够顺利的截取到协议头部分的字符串了。

截取协议体部分的字符串的方式与截取协议头部分的字符串的方式类似,同样可以通过调用字符串截取函数substring()来进行截取。但是,有所区别的是其中的两个参数:截取的起始位置的参数需调整为index+协议分隔符长度,截取的结束位置的参数需调整为协议字符串变量的总长度(如allcontent.length)。之所以起始位置要加上协议分隔符长度的原因是因为我们不需要协议分隔符,所以我们在截取协议体部分的时候需要将分隔符协议分隔符排除在外,因此在截取的时候,起始位置会从游标变量后面偏移一段长度的地方开始截取。

步骤s2、协议头的解析:将协议头字符串变量(如head变量)中的协议头标识符(如@head:)去除;根据键值对标识符(如@)对协议头字符串变量(如head变量)中剩余的信息(如@charset=utf8@length=10@type=user_define@sender=modela@receiver=modelb@md5_length=10@md5=ss@send_data_time=101010@aes=true@)进行分割,得到每个协议头字段信息对应的键值对信息(如charset=utf8、length=10等);根据每个键值对信息中的键(key)和值(value)的信息,得到对应的协议头字段信息的内容,从而完成协议头部分的解析。

实际操作中,步骤s2具体包括以下流程:

步骤s201、将协议头字符串变量(如head变量)中的协议头标识符(如@head:)去除;并将去除后的剩余内容存储于一个协议头内容字符串变量(如headcontent变量)中。

步骤s202、创建一个游标集合,用于存放定位到的键值对标识符(如@)的位置信息。

步骤s203、从协议头内容字符串变量(如headcontent变量)的首字符开始,按照每次取出与键值对标识符长度相同的字符串的方式循环取出协议头内容字符串变量中的字符串;每次取出字符串后,将取出的字符串与键值对标识符进行匹配,若匹配失败,说明取出来的字符串不是键值对标识符,即未定位到键值对标识符,则从协议头内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;若匹配成功,说明查找定位到了一个键值对标识符,则将当前的位置信息记录到所述游标集合中,再从协议头内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;如此循环,直至协议头内容字符串变量中的所有内容遍历完全。可以理解的是,遍历完成后,创建的游标集合中所存放的所有位置信息就是协议头内容字符串变量中所有键值对标识符出现的位置信息。

以键值对标识符为“@”为例,对步骤s203进行举例说明。由于协议分隔符“@”仅有一个字符,因此操作时,从协议头内容字符串变量的首字符开始,按照每次取出一个字符的方式循环取出协议头内容字符串变量中的字符;每次取出一个字符后,将取出的字符与“@”进行匹配看是否是“@”,若匹配失败,则从协议头内容字符串变量的下一个字符开始继续循环取出一个字符,并将当前位置信息的值加1;若匹配成功,则将当前的位置信息记录到所述游标集合中,再从协议头内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;如此循环,直至协议头内容字符串变量中的所有内容遍历完全。

同样,步骤s203中,在将取出的字符串与键值对标识符进行匹配时,可通过调用现有的字符串匹配函数equals来实现。

步骤s204、根据当前游标集合中所有的相邻的两条位置信息,从协议头内容字符串变量(如headcontent变量)中截取出所有的协议头字段信息对应的键值对信息。

该步骤的原理为:由于headcontent中仅仅包含了键值对标识符以及键值对信息,也就是例如@key=value形式的信息内容。通过仔细观察我们发现,每个键值对信息其实就是保存在两个键值对标识符(如@)之间的信息,因此,我们可以通过截取两个键值对标识符之间的信息来获取到每个协议头字段信息对应的键值对信息。

在具体实现的时候,同样可以通过调用字符串截取函数substring()来截取两个键值对标识符之间的信息。其实现方式为:substring(第一位置信息+键值对标识符长度,第二位置信息-键值对标识符长度),其中第一位置信息是相邻的两条位置信息中的第一个位置信息,第二位置信息是相邻的两条位置信息中的第二个位置信息,之所以两个参数要分别加上和减去键值对标识符长度,是因为截取时要屏蔽掉键值对标识符本身。

步骤s205、根据截取出的每个键值对信息中的键(key)和值(value)的信息,得到对应的协议头字段信息的内容,从而完成协议头部分的解析。

在具体实现的时候,可以通过调用现有的字符串拆分函数split函数来进行拆分。split函数可以将键值对以“=”的形式拆分成键和值然后返回。这样我们就完成了协议头部分的信息的解析工作,已经能够完全获取到协议头部分的键和值的具体信息了。

进一步的,为了保障协议头解析的有效性,即确保当前协议头部分未出现协议头信息丢失或协议格式异常的情况,从而使得协议头解析操作能准确、有效地执行。本实施例的步骤s2中,在将协议头字符串变量中的协议头标识符去除之前,还包括协议头校验操作:

通过调用java已有的字符串开头检查函数startswith(),判断协议头部分是否是以协议头标识符为开头,其实现可为:startwith(“@head:”);若是,例如startswith(“@head:”)函数返回的是ture,表明协议头校验通过,则继续进行后续操作;若否,例如startswith(“@head:”)函数返回的是false,表明协议头部分的信息有丢失或者协议格式异常,则终止解析操作,提示解析出错并给出协议头信息异常的消息。

步骤s3、协议体的解析:根据数据内容标识符(如@d:)将协议体字符串变量(如body变量)中的内容拆分成数据类型部分(如@t=user_define)和数据内容部分(@key1=value1@key2=value2@key3=value3@key4=value4@);将数据类型部分中的数据类型标识符(如@t=)去除,得到数据类型的信息(如user_define);根据键值对标识符(如@)对数据内容部分进行分割,得到每条数据对应的键值对信息(如key1=value1、key2=value2、key3=value3、key4=value4);根据每个键值对信息中的键(key)和值(value)的信息,得到对应的每条数据的内容,从而完成协议体部分的解析。

具体来说,步骤s3包括以下流程:

步骤s301、创建一个用于定位数据内容标识符的游标变量。

步骤s302、从协议体字符串变量(如body变量)的首字符开始,按照每次取出与数据内容标识符长度相同的字符串的方式循环取出协议体字符串变量中的字符串;每次取出字符串后,将取出的字符串与数据内容标识符进行匹配,若匹配失败,则从协议体字符串变量的下一个字符开始继续循环取出字符串,并将当前游标变量的值加1;若匹配成功,则保存当前游标变量的值。可以理解的是,当前游标变量的值就是下步需要截取的数据类型部分的字符串长度信息。

步骤s303、根据保存的游标变量的值,从协议体字符串变量中截取出数据类型部分的字符串并存储至数据类型字符串变量(如bodyhead变量)中;从协议体字符串变量中截取出数据内容部分的字符串并存储至数据内容字符串变量(如bodycontent变量)中。

在具体实现的时候,截取数据类型部分的字符串的操作以及截取数据内容部分的字符串的操作均可以按照上述步骤s103的具体实现(即通过调用字符串截取函数substring()来截取),此处不再赘述。

步骤s304、将数据类型字符串变量(如bodyhead变量)中的数据类型标识符(如@t=)去除,得到数据类型的信息。可以理解的是,到此步骤为止,已完成了协议体中数据类型部分的解析,接下来将完成协议体中数据内容部分的解析。

步骤s305、创建一个用于存放键值对标识符的位置信息的游标集合。

步骤s306、从数据内容字符串变量(如bodycontent变量)的首字符开始,按照每次取出与键值对标识符长度相同的字符串的方式循环取出数据内容字符串变量中的字符串;每次取出字符串后,将取出的字符串与键值对标识符进行匹配,若匹配失败,说明取出来的字符串不是键值对标识符,即未定位到键值对标识符,则从数据内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;若匹配成功,说明查找定位到了一个键值对标识符,则将当前的位置信息记录到所述游标集合中,再从数据内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;如此循环,直至数据内容字符串变量中的所有内容遍历完全。可以理解的是,遍历完成后,创建的游标集合中所存放的所有位置信息就是数据内容字符串变量中所有键值对标识符出现的位置信息。

步骤s307、根据当前游标集合中所有的相邻的两条位置信息,从数据内容字符串变量(如bodycontent变量)中截取出所有的数据对应的键值对信息。其具体的实现方式,与上述步骤204的具体实现相同(即通过调用字符串截取函数substring()来截取),此处不赘述。

步骤s308、根据截取出的每个键值对信息中的键(key)和值(value)的信息,得到对应的每条数据的内容,从而完成协议体部分的解析。

在具体实现的时候,同样可以通过调用现有的字符串拆分函数split函数来进行拆分。split函数可以将键值对以“=”的形式拆分成键和值然后返回。这样我们就完成了协议体部分的信息的解析工作,已经能够完全获取到协议体中数据内容部分的键和值的具体信息了。

进一步的,本实施例中,所述协议头字段信息中包括数据类型的字段信息。为了保障协议体解析的有效性,即确保当前协议体未出现协议体的内容错误的情况,使得协议体解析操作能准确、有效地执行。本实施例的步骤s3中,在将数据类型部分中的数据类型标识符(如@t=)去除,得到数据类型的信息之后,还包括协议体校验操作:

将得到的数据类型的信息与协议头字段信息中包含的数据类型的字段信息进行比对,判断两者是否相同;若是,表明协议体校验通过,则继续进行后续操作;若否,表明协议体的内容错误,则终止解析操作,提示解析出错并给出协议体内容错误的消息。

对应上述的解析通信协议的方法,本发明实施例还提供一种存储介质,其上存储有计算机程序,该计算机程序被处理器执行时可实现上述各实施例中解析通信协议的方法的步骤。需要说明的是,所述存储介质包括u盘、移动硬盘、rom(read-onlymemory,只读存储器)、ram(randomaccessmemory,随机存取存储器)、磁碟或者光盘等各种可以存储程序代码的介质。

另外,参见图2所示,对应上述的解析通信协议的方法,本发明实施例还提供一种解析通信协议的设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,该处理器执行计算机程序时可实现上述各实施例中解析通信协议的方法的步骤。

参见图3所示,本发明实施例还提供一种解析通信协议的系统,该系统包括顺次相连的协议拆分模块、协议头解析模块和协议体解析模块;

协议拆分模块用于:根据协议头与协议体之间的协议分隔符,将通信协议拆分成协议头部分和协议体部分;并将协议头部分的信息存储至一个协议头字符串变量中,将协议体部分的信息存储至一个协议体字符串变量中;

协议头解析模块用于:将协议头字符串变量中的协议头标识符去除;根据键值对标识符将协议头字符串变量中剩余的信息分割,得到每个协议头字段信息对应的键值对信息;根据每个键值对信息中的键和值的信息,得到对应的协议头字段信息的内容;

协议体解析模块用于:根据数据内容标识符将协议体字符串变量中的内容拆分成数据类型部分和数据内容部分;将数据类型部分中的数据类型标识符去除,得到数据类型的信息;根据键值对标识符将数据内容部分分割,得到每条数据对应的键值对信息;根据每个键值对信息中的键和值的信息,得到对应的每条数据的内容。

参见图4所示,协议拆分模块包括初始设置子模块、协议分隔符定位子模块、协议头及协议体截取子模块。

其中,初始设置子模块用于:将通信协议的所有内容赋值于一个协议字符串变量中;并创建一个用于定位协议分隔符的位置的游标变量;

协议分隔符定位子模块用于:从协议字符串变量的首字符开始,按照每次取出与协议分隔符长度相同的字符串的方式循环取出协议字符串变量中的字符串;每次取出字符串后,将取出的字符串与协议分隔符进行匹配,若匹配失败,则从协议字符串变量的下一个字符开始继续循环取出字符串,并将当前游标变量的值加1;若匹配成功,则保存当前游标变量的值;

协议头及协议体截取子模块用于:根据所述协议分隔符定位子模块保存的游标变量的值,从协议字符串变量中截取出协议头部分的字符串并存储至协议头字符串变量中,从协议字符串变量中截取出协议体部分的字符串并存储至协议体字符串变量中。

参见图5所示,协议头解析模块包括协议头标识符去除子模块、游标集合创建子模块、键值对标识符定位子模块、键值对信息截取子模块、协议头字段信息获取子模块。

其中,协议头标识符去除子模块用于:将协议头字符串变量中的协议头标识符去除;并将去除后的剩余内容存储至一个协议头内容字符串变量中;

游标集合创建子模块用于:创建一个用于存放键值对标识符的位置信息的游标集合;

键值对标识符定位子模块用于:从协议头内容字符串变量的首字符开始,按照每次取出与键值对标识符长度相同的字符串的方式循环取出协议头内容字符串变量中的字符串;每次取出字符串后,将取出的字符串与键值对标识符进行匹配,若匹配失败,则从协议头内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;若匹配成功,则将当前的位置信息记录到所述游标集合中,再从协议头内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;如此循环,直至协议头内容字符串变量中的所有内容遍历完全;

键值对信息截取子模块用于:根据当前游标集合中所有的相邻的两条位置信息,从协议头内容字符串变量中截取出所有的协议头字段信息对应的键值对信息;

协议头字段信息获取子模块用于:根据截取出的每个键值对信息中的键和值的信息,得到对应的协议头字段信息的内容。

参见图6所示,协议体解析模块包括游标变量创建子模块、数据内容标识符定位子模块、数据类型及数据内容截取子模块、数据类型信息获取子模块、协议体游标集合创建子模块、协议体键值对标识符定位子模块、协议体键值对信息截取子模块、数据内容信息获取子模块。

其中,游标变量创建子模块用于:创建一个用于定位数据内容标识符的游标变量;

数据内容标识符定位子模块用于:从协议体字符串变量的首字符开始,按照每次取出与数据内容标识符长度相同的字符串的方式循环取出协议体字符串变量中的字符串;每次取出字符串后,将取出的字符串与数据内容标识符进行匹配,若匹配失败,则从协议体字符串变量的下一个字符开始继续循环取出字符串,并将当前游标变量的值加1;若匹配成功,则保存当前游标变量的值;

数据类型及数据内容截取子模块用于:根据保存的游标变量的值,从协议体字符串变量中截取出数据类型部分的字符串并存储至数据类型字符串变量中;从协议体字符串变量中截取出数据内容部分的字符串并存储至数据内容字符串变量中;

数据类型信息获取子模块用于:将数据类型字符串变量中的数据类型标识符去除,得到数据类型的信息;

协议体游标集合创建子模块用于:创建一个用于存放键值对标识符的位置信息的游标集合;

协议体键值对标识符定位子模块用于:从数据内容字符串变量的首字符开始,按照每次取出与键值对标识符长度相同的字符串的方式循环取出数据内容字符串变量中的字符串;每次取出字符串后,将取出的字符串与键值对标识符进行匹配,若匹配失败,则从数据内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;若匹配成功,则将当前的位置信息记录到所述游标集合中,再从数据内容字符串变量的下一个字符开始继续循环取出字符串,并将当前位置信息的值加1;如此循环,直至数据内容字符串变量中的所有内容遍历完全;

协议体键值对信息截取子模块用于:根据游标集合中所有的相邻的两条位置信息,从数据内容字符串变量中截取出所有的数据对应的键值对信息;

数据内容信息获取子模块用于:根据所述协议体键值对信息截取子模块截取出的每个键值对信息中的键和值的信息,得到对应的每条数据的内容。

进一步的,为了保障协议头解析的有效性,即确保当前协议头部分未出现协议头信息丢失或协议格式异常的情况,从而使得协议头解析操作能准确、有效地执行。协议头解析模块还包括协议头校验子模块,该协议头校验子模块用于:判断协议头部分是否是以协议头标识符为开头,若不是,则终止解析操作,提示解析出错并给出协议头信息异常的消息。

更进一步的,为了保障协议体解析的有效性,即确保当前协议体未出现协议体的内容错误的情况,使得协议体解析操作能准确、有效地执行。所述协议体解析模块还用于:在得到数据类型的信息后,将得到的数据类型的信息与协议头字段信息中包含的数据类型的字段信息进行比对,判断两者是否相同;若不相同,则终止解析操作,提示解析出错并给出协议体内容错误的消息。

需要说明的是:上述实施例提供的系统在进行通信协议解析时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将系统的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。

本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。

本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1