本发明涉及数据处理技术领域,尤其涉及一种数据结构化封装的方法。
背景技术:
随着信息技术的发展,以及人们对信息技术需求的不断提高,越来越需要一些硬件传感器、低端非智能化的硬件设备以及物联网设备等能与服务器、个人电脑、智能化设备等进行数据交互。但由于硬件设备一般都受到大小、成本、用途、功耗等因素的约束,在数据处理与存储方面都比较简单,一般都是以某一特定格式的二进制数据进行存储,这使得外界系统要与之进行数据交互时,必须要有解析这一特定格式的二进制数据的能力,并要能把解析出的数据再封装成结构化数据供外界系统使用,上述解析与封装数据的方法是建立数据交互的关键技术。
现有技术方案一般是按照约定好的二进制数据格式,按部就班的进行解析,该方法存在如下缺点:按部就班解析方式的复杂度会随着数据格式的深度成倍增长;协议越复杂,数据结构化封装部分就越复杂、嵌套层次越深、代码可读性越差,使得难以维护;数据结构化封装部分的代码无法精简,代码量大;封装方式不灵活,只要二进制数据格式略有改动,对应的封装代码就必须做出相应调整。
技术实现要素:
本发明的目的是提供一种数据结构化封装的方法,该方法能简化数据封装的操作,使处理代码简洁可读性高,能灵活处理二进制原始数据格式的变动。
本发明的目的是通过以下技术方案实现的:
一种数据结构化封装的方法,所述方法包括:
步骤1、根据待封装目标数据的结构,预先设计相应的结构化数据模板;
步骤2、将所述结构化数据模板初始化成模板对象;
步骤3、在解析待封装目标数据的二进制原始数据的过程中,每解析出一段明文,则根据解析协议将该段明文值赋给所述模板对象对应的数据段中;
步骤4、待全部二进制原始数据解析完成,则所述结构化数据模板也就填值完成,再输出相应的结构化数据。
在步骤1中,设计相应的结构化数据模板的过程具体为:
首先选择结构化数据模板封装格式,具体选择json格式作为结构化数据模板的封装格式;
然后学习原始协议的封装规则说明文档;
再根据原始协议的封装规则来分析二进制报文相对应的字段及明文意义,对各个字段进行分类,依据不同字段定义key名,按需调整key名的上下文位置及层次结构,最终得到json格式的结构化数据模板。
所述步骤3的过程具体为:
首先将待封装目标数据的二进制原始数据存入byte数组;
然后根据协议规则依次解析协议数据,具体为:
先解析第一段数据,从keymodelarray对象中取出预先定义好的第一段数据的key名,再将第一段数据的明文值赋给模板对象对应的数据段中;
再解析第二段数据,从keymodelarray对象中取出预先定义好的第二段数据的key名,再将第二段数据的明文值赋给模板对象对应的数据段中;
按照上述循环方式处理后续数据的解析,直到所有数据处理完成。
由上述本发明提供的技术方案可以看出,上述方法能简化数据封装的操作,使处理代码简洁可读性高,能灵活处理二进制原始数据格式的变动。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。
图1为本发明实施例提供的数据结构化封装的方法流程示意图。
具体实施方式
下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。
下面将结合附图对本发明实施例作进一步地详细描述,如图1所示为本发明实施例提供的数据结构化封装的方法流程示意图,所述方法包括:
步骤1、根据待封装目标数据的结构,预先设计相应的结构化数据模板;
在该步骤中,设计相应的结构化数据模板的过程具体为:
首先选择结构化数据模板封装格式;具体在设计结构化数据时,选用软件开发领域比较流行的json格式作为结构化数据模板的封装格式,该格式为“key-value”格式,优点是格式简洁,数据封装灵活,与不同开发语言之间的兼容比较好,编程时转换成数据对象比较容易;
然后学习原始协议的封装规则说明文档;
然后根据原始协议的封装规则来分析二进制报文相对应的字段及明文意义,对各个字段进行分类,依据不同字段定义key名,按需调整key名的上下文位置及层次结构,最终形成json格式的结构化数据模板。
举例来说,设计结构化数据模板的详细过程示例如下:
假设有如下这样一段协议的封装规则说明内容,该二进制报文的消息的总长度为13字节,各个字节的含义如下表1所示:
表1:封装规则
然后根据上表中的封装规则,这段协议主要有报文帧头、协议版本号、目标设备模式、预留字段、命令码、状态码这几个字段;
再分析每个字段的意义可以看出,报文帧头是用于标识帧命令开始位置的,因此不具备业务意义,这类字段在定义模板时可以抛弃;
结合json格式,我们可以把模板定为如下格式:
//字段名的模板
stringkeymodel="[{'key':'version'},{'key':
'devicemodel'},{'key':'reservedfields'},{'key':'code'},{'key':
'status'}]"
//结果模板
stringrestultmodel="{'version':”,'devicemodel':”,'
reservedfields':”,'code':”,'status':”}";
值得注意的是,在定义模板阶段只需要把key值和层次结构确定即可,value先预留空字符串,在编程过程中填值。
步骤2、将所述结构化数据模板初始化成模板对象;
该步骤中,在编程语言中,对象是一种封装概念,是把特定的一种类型数据转换成编程语言中的一种特定对象,可方便程序中进行调用。
上述结构化数据模板初始化成模板对象这一步骤对于面向对象的编程语言来说,通过代码就可以实现,举例来说,以java语言为例:
//字段名的模板
stringkeymodel="[{'key':'version'},{'key':'devicemodel'},{'key':'reservedfields'},{'key':'code'},{'key':'status'}]"
//结果模板
stringrestultmodel="{'version':”,'devicemodel':”,'reservedfields':”,'code':”,'status':”}";
//转换成模板对象
jsonarraykeymodelarray=jsonobject.parsearray(keymodel);
jsonobjectrestultmodelobj=jsonobject.parseobject(restultmodel)。
步骤3、在解析待封装目标数据的二进制原始数据的过程中,每解析出一段明文,则根据解析协议将该段明文值赋给所述模板对象对应的数据段中;
该步骤中,具体过程为:
首先将待封装目标数据的二进制原始数据存入byte数组;
然后根据协议规则依次解析协议数据,具体为:
先解析第一段数据,从keymodelarray对象中取出预先定义好的第一段数据的key名,再将第一段数据的明文值赋给模板对象对应的数据段中;
再解析第二段数据,从keymodelarray对象中取出预先定义好的第二段数据的key名,再将第二段数据的明文值赋给模板对象对应的数据段中;
按照上述循环方式处理后续数据的解析,直到所有数据处理完成。
举例来说,参考上述步骤1中表1的封装规则,假设二进制数据报文如下(为了方便书写和表述,此处把二进制数据以十六进制来书写):
7e010100000000000000000200
再以java语言为例来处理上述二进制数据报文:
//将数据报文读入存入byte数组
byte[]data=
{'7e','01','01','00','00','00','00','00','00','00','00','02','00'};
//根据协议规则依次解析协议
//解析第一段数据
intversion=arrays.copyofrange(data,1,2)
//从keymodelarray对象中取出预先定义好的第一段数据的key名
stringkeyname=keymodelarray.getjsonobject(1).getstring('key')
//把第一段数据赋给模板对象对应的数据段中
jsonobj.put(keyname,version)
//解析第二段数据
intdevicemodel=arrays.copyofrange(data,2,3)
//从keymodelarray对象中取出预先定义好的第二段数据的key名
stringkeyname=keymodelarray.getjsonobject(2).getstring('key')
//把第二段数据赋给模板对象对应的数据段中
jsonobj.put(keyname,devicemodel)
……
//一直到处理完成
具体实现中,实际编程过程中会使用循环方式来处理第一段、第二段……第n段的数据解析,上述两段解析示例是为了方便描述,易于理解,采用了顺序处理方式。
步骤4、待全部二进制原始数据解析完成,则所述结构化数据模板也就填值完成,再输出相应的结构化数据。
举例来说,按照上述步骤1、2、3的操作处理完成后,最终输出的结构化数据为:
"{'version':1,'devicemodel':1,'reservedfields':”,'code':'2','status':'0'}"
值得注意的是,本发明实施例中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。