CN106844855A - 一种通用数据交互模型构建、基于该模型编码及解码方法 - Google Patents
一种通用数据交互模型构建、基于该模型编码及解码方法 Download PDFInfo
- Publication number
- CN106844855A CN106844855A CN201611183614.3A CN201611183614A CN106844855A CN 106844855 A CN106844855 A CN 106844855A CN 201611183614 A CN201611183614 A CN 201611183614A CN 106844855 A CN106844855 A CN 106844855A
- Authority
- CN
- China
- Prior art keywords
- data
- type
- model
- types
- variable
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/20—Design optimisation, verification or simulation
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Evolutionary Computation (AREA)
- Geometry (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明提供了一种通用数据交互模型构建、基于该模型编码及解码方法,首先,利用HLA提供的可变长数组和固定记录类型实现通用数据交互模型映射表数据结构的表示;然后,将通用数据交互模型中的数据项定义为字节数组类型;最后,将任意类型,包括简单数据类型、数组数据类型、结构数据类型转化成字节流数据,从而实现通用数据交互模型中数据项对多种不同类型数据的表示;通过建立HLA仿真系统中的通用数据交互模型实现编码/解码过程,能够有效提高仿真联邦开发的效率,减小仿真联邦开发中潜在的错误因数和风险,降低开发成本。
Description
技术领域
本发明属于计算机分布式仿真技术及应用领域,具体涉及一种通用数据交互模型构建、基于该模型编码及解码方法。
背景技术
随着计算机软硬件技术的发展,日趋成熟的仿真技术为航空、航天、军事、交通、能源、经济等领域的大规模复杂系统仿真提供了高效可靠的解决方案。HLA(High LevelArchitecture)由美国国防部建模与仿真办公室(DMSO)于上世纪九十年代中期提出。它是继DIS分布式仿真协议后的又一先进分布式仿真技术协议框架。HLA的宗旨是解决分布式仿真系统中各仿真成员的重用性和成员间的互操作性问题。从提出至今,HLA不断被发展完善,先后形成了3个版本,分别是DMSO HLA1.3版本、IEEE1516-2000版本和IEEE1516-2010版本(HLA Evolved版本),其中后两者均被IEEE接收为开放性的国际标准。HLA协议通过规则、接口规范和对象模型模板(OMT)三部分对分布式仿真系统中各仿真成员的交互进行了全面的规范和约束,通过相应的支撑服务将仿真功能实现、仿真运行管理与底层数据通信分离,从而保证互操作性和重用性。
在HLA分布式仿真框架中,一个完成特定仿真任务的仿真系统叫做联邦(Federation)。联邦由分布于不同仿真计算机上的联邦成员(Federate)组成,它们通过运行支撑环境RTI进行仿真交互,实现分布式协同和仿真。联邦成员之间主要通过对象类的属性和交互类的参数两种方式进行数据交互。这些应用层的数据,包括整型数据、浮点型数据、字符串型数据、数组型和结构型数据等,均需要编码为字节流数据,再由RTI传输给各联邦成员。因此,两个进行数据交互的邦员之间必须进行一致的数据编码/解码工作,即数据生产者按照约定的数据类型和格式完成数据的编码,由应用层数据转化为传输字节流数据,数据消费者按照对应的方法完成数据的解码,由传输字节流数据转化为应用层数据,才能准确的实现信息交互。
根据DMSO专门针对HLA仿真系统开发提出的联邦开发与执行过程模型,联邦开发后期的相当一部分工作是完成联邦的集成和测试。通常,集成和测试的大部分工作在于验证联邦成员间是否按照联邦协定正确实现数据交互。大部分错误的数据交互主要是由于错误的数据编码/解码引起的。由于RTI中传输的字节流数据不能包含其实际编码时的控制信息,因此任何不匹配的解码都会引起未定义或错误的操作。错误或不匹配的编解码过程将引起联邦成员或联邦的崩溃。这些错误通常只能在联邦开发后期的集成和测试阶段发现,特别是对于大型仿真系统,由于联邦成员的数目多,难以定位具体错误的位置,大大降低了仿真系统的开发效率,增加了仿真系统的开发成本和风险。
仿真联邦的数据交互通过OMT标准化的联邦对象模型(Federation ObjectModel,FOM)文件进行规范化的描述。联邦成员负责按照FOM文件中规定的数据格式完成数据的编码/解码工作,但是由于不同开发人员的习惯、经验不同,以及开发时的疏忽,不能保证所有联邦成员均按照FOM文件中的约定,正确的实现编码/解码工作。为了实现正确快速的编码/解码工作,尽可能的减少引起代码中的错误操作的因素,降低联邦开发的成本和风险,HLA协议OMT部分对数据类型作出专门的约束和规范化声明,包括基本数据类型、简单数据、枚举数据、数组数据、结构型数据等;对这些数据类型的编码/解码过程进行说明,包括字节边界、字节对齐和大小端模式。同时,HLA Evolved版本还提供了C++/JAVA/WSDL语言的编码/解码器,使不同的联邦开发人员可以使用相同的、相匹配的数据编码/解码实现方法,保证编码/解码的正确性,最大程度的降低了数据编码/解码对联邦开发带来的影响。
HLA协议对数据类型和数据编码/解码的规范化处理,减少了仿真系统集成的时间和风险。但是,对于不同的仿真系统,特别是复杂大型系统的仿真,往往包含大量复杂的自定义数据类型,无法直接用HLA协议中提供的数据类型进行表示,需要利用HLA提供的简单数据类型构造相应的复杂数据结构,同样需要大量的工作实现新定义的数据的编码/解码工作。自定义的数据类型往往针对特殊的仿真系统,不仅本身的重用性差,而且所开发的仿真模型的重用性和互操作性也较差,从而带来重复的开发工作、不必要开发成本和开发时间。
发明内容
本发明的目的在于,为了提高仿真联邦的开发效率,增加仿真邦员的重用性和互操作性,本发明在HLA协议OMT标准的基础上,提供了一种应用于HLA仿真系统的通用数据交互模型构建、编码及解码方法。通过建立HLA仿真系统中的通用数据交互模型实现编码/解码过程,能够有效提高仿真联邦开发的效率,减小仿真联邦开发中潜在的错误因数和风险,降低开发成本。
为实现上述目的,本发明提出了一种通用数据交互模型构建、基于该模型编码及解码方法,在HLA协议提供的数据类型及其编解码器的基础上,完成通用数据交互模型及其编码/解码设计。
所述的通用数据交互模型通过以下构建方法实现,该构建方法具体包括:
步骤101)利用HLA协议中提供的可变长数组类型HLAvariableArray将通用数据交互模型表示为可变长数组,该可变长数组中的各元素表示通用数据交互模型中的一个数据记录;所述的通用数据交互模型为若干行数据记录组合而成的映射表,每一行数据记录均包括标识和数据项,分别用于标识数据和存储数据的值;
步骤102)利用HLA协议中提供的固定记录类型HLAfixedRecord将步骤101)中可变长数组的各元素类型表示为HLAfixedRecord类型;所述的固定记录类型包含标识域和数据项域,标识域利用HLA协议中提供的字符串类型HLAunicodeString表示,代表通用数据交互模型中数据记录的标识,数据项域利用HLA协议中提供的字节数组类型HLAopaqueData表示,代表通用数据交互模型中数据记录的数据项,该数据项域存储通用数据交互模型中数据项的数据编码生成的字节流数据VariableLengthData;
步骤103)根据HLA协议,将通用数据交互模型中记录的各数据项按简单数据类型、数组数据类型和结构数据类型分别划分为简单数据、数组数据和结构数据;
步骤104)利用HLA协议中提供的固定记录类型HLAfixedRecord对步骤103)中的简单数据、数组数据和结构数据编码生成的字节流数据VariableLengthData进行表示,该固定记录类型包含数据类型标识域和数据域,所述的数据类型标识域为字符串类型,利用HLA协议提供的字符串类型HLAunicodeString表示,用于记录数据本身的类型信息,所述的数据域为字节数组类型,利用HLA协议提供的字节数组类型HLAopaqueData表示;
步骤105)对于步骤104)中数组数据或结构数据的数据域,利用HLA协议中提供的可变长数组类型HLAvariableArray表示为可变长数组,并利用HLA协议中提供的字节数组类型HLAopaqueData将可变长数组的各元素类型表示为HLAopaqueData类型,各元素存储原始数组数据或原始结构数据对应位置元素编码生成的字节流数据VariableLengthData;
步骤106)将原始数组数据或原始结构数据对应位置元素编码生成的字节流数据VariableLengthData按步骤103)进行数据类型划分,如果划分为简单数据,则停止操作,如果仍划分为数组数据或结构数据,则重新执行步骤104)。
作为上述技术方案的进一步改进,所述的简单数据类型包括:16位整型、32位整型、64位整型、单精度浮点数、双精度浮点数、BOOL型、ASCII码字符、Unicode字符、字节型、ASCII码字符串和Unicode字符串,并依次利用HLA协议中提供的类型HLAinteger16BE、HLAinteger32BE、HLAinteger64BE、HLAfloat32BE、HLAfloat64BE、HLAboolean、HLAASCIIchar、HLAunicodeChar、HLAbyte、HLAASCIIstring和HLAunicodeString进行表示。
基于上述通用数据交互模型,本发明还提供了一种基于通用数据交互模型的编码方法,该编码方法具体包括:
步骤201)创建类型为HLAvariableArray的模型port_va,将其各元素类型表示为HLAfixedRecord类型,并且将HLAfixedRecord类型中的标识域表示为HLAunicodeString类型,将数据项域表示为HLAopaqueData类型,利用模型port_va存储通用数据交互模型转化生成的HLAvariableArray类型的数据;
步骤202)读取通用数据交互模型的映射表中一个未处理的数据记录行,获得该数据记录行的标识和数据项;
步骤203)判断数据记录行中数据项的数据类型,如果判断为数组数据类型则转到步骤204);如果判断为结构数据类型则转到步骤211);如果判断为简单数据类型则转到步骤218);
步骤204)创建类型为HLAvariableArray的模型encode_va,并将其数组元素类型初始化为HLAopaqueData类型;
步骤205)读取数组数据中一个未处理的数组元素,判断数组元素的数据类型;
步骤206)如果步骤205)中读取的数组元素为数组数据类型,则转到步骤204),以处理数组数据相同的步骤处理其数组元素;如果步骤205)中读取的数组元素为结构数据类型,则转到步骤211),以处理结构数据相同的步骤处理该数组元素;如果步骤205)中读取的数组元素为简单数据类型,则转到步骤218),以处理简单数据相同的步骤处理该数组元素;经过多次递归迭代,直到最终以VariabLengthData类型返回数组元素编码生成的字节流;
步骤207)创建类型为HLAopaqueData的模型ele_opa,并利用步骤206)中返回的VariabLengthData类型数据初始化模型ele_opa;将初始化后的模型ele_opa添加到步骤204)定义的模型encode_va中;
步骤208)判断数组数据中所有元素是否已经处理完成,如果存在未处理的元素,则转到步骤205);否则,转到步骤209);
步骤209)创建类型为HLAfixedRecord的模型data_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为数组类型标识字符串“va”;将其第二个数据域初始化为HLAvariableArray类型,并赋值为步骤204)定义的encode_va;
步骤210)创建类型为HLAopaqueData的模型data_opa,调用步骤209)创建的模型data_rec中的编码接口,编码生成VariableLengthData类型的字节流数据,并利用该字节流数据初始化模型data_opa后,转到步骤222);
步骤211)创建类型为HLAvariableArray的模型encode_va,并将其数组元素类型初始化为HLAopaqueData类型;
步骤212)读取结构数据中一个未处理的数据域,判断数据域的数据类型;
步骤213)如果步骤212)中读取的数据域为数组数据类型,则转到步骤204),以处理数组数据相同的步骤处理该数据域;如果步骤212)中读取的数据域为结构数据类型,则转到步骤211),以处理结构数据相同的步骤处理其数据域;如果步骤212)中读取的数据域为简单数据类型,则转到步骤218),以处理简单数据相同的步骤处理该数据域;经过多次递归迭代,直到最终以VariabLengthData的类型返回数据域编码生成的字节流;
步骤214)创建类型为HLAopaqueData的模型ele_opa,并利用步骤213)中返回的VariabLengthData类型数据初始化ele_opa;将初始化后的模型ele_opa添加到步骤211)定义的模型encode_va中;
步骤215)判断结构数据中所有的数据域是否已经处理完成,如果存在未处理的数据域,则转到步骤212);否则,转到步骤216);
步骤216)创建类型为HLAfixedRecord的模型data_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为结构类型标识字符串“st”;将其第二个数据域初始化为HLAvariableArray类型,并赋值为步骤211)定义的encode_va;
步骤217)创建类型为HLAopaqueData的模型data_opa,调用步骤216)创建的模型data_rec中的编码接口,编码生成VariableLengthData类型的字节流数据,并利用该字节流数据初始化模型data_opa后,转到步骤222);
步骤218)根据简单数据类型的分类,将数据记录行中数据项划分为不同的子类,按照子类对应的C++类创建模型,并初始化为数据项的实际值后,调用模型中的编码接口,编码生成VariableLengthData类型的字节流数据;
步骤219)创建类型为HLAopaqueData的模型ele_opa,并利用步骤218)中返回的VariabLengthData类型数据初始化ele_opa;
步骤220)创建类型为HLAfixedRecord的模型data_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为简单数据类型标识字符串,该简单数据类型标识字符串与数据项的子类类型一致;将第二个数据域初始化为HLAopaqueData类型,并赋值为步骤219)定义的ele_opa;
步骤221)创建类型为HLAopaqueData的模型data_opa,调用步骤220)创建的模型data_rec中的编码接口,编码生成VariableLengthData类型的字节流数据,并利用该字节流数据初始化模型data_opa后,转到步骤222);
步骤222)创建类型为HLAfixedRecord的模型port_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为步骤202)中数据记录行的标识;将其第二个数据域初始化为HLAopaqueData类型,赋值为来自步骤210)或步骤217)或步骤221)中的data_opa,将port_rec添加到步骤201)创建的port_va中;
步骤223)判断通用数据交互模型的映射表中所有数据记录行是否处理完成,如果存在未处理的数据记录行,则转到步骤202);否则,转到步骤224);
步骤224)调用步骤201)创建的模型port_va中的编码接口,编码生成VariablengthData类型的字节流数据,至此,完成了通用数据交互模型中的数据到字节流数据的编码工作。
基于上述通用数据交互模型,本发明还提供了一种通用数据交互模型的解码方法,该解码方法具体包括:
步骤301)创建类型为HLAvariableArray的模型port_va,将其存放的各元素类型表示为HLAfixedRecord类型,并且将该HLAfixedRecord类型中的标识域表示为HLAunicodeString类型,将数据项域表示为HLAopaqueData类型;
步骤302)调用模型port_va中的解码接口,并以被解码的VariableLengthData类型的数据作为解码接口的输入参数,实现将字节流数据解码为步骤301)中所定义的数据类型;
步骤303)读取模型port_va中一个未处理的元素,存储于变量data_rec中;
步骤304)读取变量data_rec的第二个数据域,即类型为HLAopaqueData的数据域,将其存放在变量data_opa中;
步骤305)将变量data_opa中的字节流数据提取出来,并存放到类型为VariableLengthData的变量data_vld中;
步骤306)创建类型为HLAfixedRecord的模型trans_rec,将其第一个数据域初始化为HLAunicodeString类型;
步骤307)调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤308)读取模型trans_rec的第一个数据域,该第一个数据域表示为HLAunicodeString类型,将其存放到变量type_str中;
步骤309)判断变量type_str的值,如果为字符串“va”,则表明数据为数组数据类型,转到步骤310);如果为字符串“st”,则表明数据为结构数据类型,转到步骤318);否则,表明数据为简单数据类型,转到步骤326);
步骤310)创建类型为HLAvariableArray的模型data_va,其存放的数据元素为HLApaqueData类型;
步骤311)将步骤306)中创建的模型trans_rec的第二个数据域初始化为与步骤310)中模型data_va相同的数据类型,即数据元素为HLApaqueData类型的HLAvariableArray类型;
步骤312)再次调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤313)获取模型trans_rec的第二个数据域中的数据,将其赋值给步骤310)创建的模型data_va;
步骤314)读取步骤310)创建的模型data_va中一个未处理的元素,将其存放在类型为HLAopaqueData的变量ele_opa中,转到步骤305),以处理变量data_opa相同的步骤处理ele_opa;经过多次迭代,完成步骤310)创建的模型data_va中一个元素的解码,解码后返回值为DataElement的某一子类;
步骤315)将步骤314)中解码返回的值添加到类型为HLAvariableArray的变量dec_ele_va中;
步骤316)判断步骤310)创建的模型data_va中的所有元素是否已经处理完成,如果存在未处理的元素,转到步骤314);否则,转到步骤317);
步骤317)读取步骤303)中定义的变量data_rec的第一个数据域,该数据域为HLAunicodeString类型,其值为通用数据交互模型中数据记录行的标识,读取步骤315)中定义的变量dec_ele_va的值,其值即为通用数据交互模型中数据记录行的数据项,从而完成一个数据记录行的解码后,转到步骤332);
步骤318)创建类型为HLAvariableArray的模型data_va,其存放的数据元素为HLApaqueData类型;
步骤319)将步骤306)中创建的模型trans_rec的第二个数据域初始化为与步骤310)中模型data_va相同的数据类型,即数据元素为HLApaqueData类型的HLAvariableArray类型;
步骤320)再次调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤321)获取模型trans_rec的第二个数据域中的数据,将其赋值给步骤318)创建的模型data_va;
步骤322)读取步骤318)创建的模型data_va中一个未处理的元素,将其存放在类型为HLAopaqueData的变量ele_opa中,转到步骤305),以处理变量data_opa相同的步骤处理ele_opa;经过多次迭代,完成步骤318)创建的模型data_va中一个元素的解码,解码后返回值为DataElement的某一子类;
步骤323)将步骤322)中解码返回的值添加到类型为HLAfixedRecord的变量dec_ele_rec中;
步骤324)判断步骤318)创建的模型data_va中的所有元素是否已经处理完成,如果存在未处理的元素,转到步骤322);否则,转到步骤325);
步骤325)读取步骤303)中定义的变量data_rec的第一个数据域,该数据域为HLAunicodeString类型,其值为通用数据交互模型中数据记录行的标识,读取步骤323)中定义的变量dec_ele_rec的值,其值即为通用数据交互模型中数据记录行的数据项,从而完成一个数据记录行的解码后,转到步骤332);
步骤326)将步骤306)中创建的模型trans_rec的第二个数据域初始化为HLAopaqueData类型;
步骤327)再次调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤328)获取模型trans_rec的第二个数据域中的数据,将其赋值给类型为HLAopaqueData的变量dec_opa,将该变量dec_opa中存放的字节数据提取出来后存放在类型为VariableLengthData的变量dec_vld中;
步骤329)根据步骤308)定义的变量type_str的值,确定由简单数据类型所划分的子类,创建与该子类相应的数据类型模型dec_bsc;
步骤330)调用数据类型模型dec_bsc中的解码接口,以变量dec_vld作为输入参数,完成简单数据类型的解码工作;
步骤331)读取步骤303)中定义的变量data_rec的第一个数据域,该数据域为HLAunicodeString类型,其值为通用数据交互模型中数据记录行的标识,读取步骤330)中定义的数据类型模型dec_bsc的值,其值即为通用数据交互模型中数据记录行的数据项,从而完成一个数据记录行的解码后,转到步骤332);
步骤332)判断步骤301)定义的模型port_va中的所有元素是否已经处理完,如果存在未处理的元素,则转到步骤303);否则,判定完成了通用数据交互模型中的字节流数据的解码工作。
本发明的一种通用数据交互模型构建、基于该模型编码及解码方法优点在于:
1)本发明中的通用的数据交互模型编码/解码方法,能够实现对常用的多种数据类型,包括整型、浮点型、字符型、字符串型、数组型和结构型等进行统一表示;
2)本发明中的通用的数据交互模型编码/解码方法,能够对数组中包含数组、数组中包含结构、结构中包含结构和结构中包含数组的复杂数据实现递归编码和解码;
3)本发明中的通用的数据交互模型编码/解码方法,从根本上避免了由于编码/解码问题造成联邦成员间的数据交互失败的问题,缩短了分布式仿真系统集成测试时间,降低了系统开发风险和成本;
4)本发明中的通用的数据交互模型编码/解码方法,增加了代码的重用性和仿真模型间的互操作性,有效避免重互工作,缩短开发周期,降低了开发成本。
附图说明
图1为本发明中的一种通用数据交互模型结构示意图。
具体实施方式
下面结合附图和实施例对本发明所述的一种通用数据交互模型构建、基于该模型编码及解码方法进行详细说明。
本发明采用一种通用的数据交互模型,对仿真模型的4类数据成员:输入数据、输出数据、可配置参数和内部状态数据进行统一的表示。如表1所示,该通用数据交互模型采用映射表的数据结构建立,映射表的第一列称为标识列,第二列称为数据项列;其中,标识列的内容相当于数据的名称,用于对数据进行唯一识别;数据项列的内容为数据成员的值,可以是不同的数据类型,包括不同位数的整型、不同精度的浮点型、字符型、字符串型、不同类型的数组型以及结构型等;映射表中的每一行为一个数据记录,代表了仿真模型的一个输入数据成员、输出数据成员、可配置参数或内部状态数据,同时,映射表中的记录数目是动态的,即表1中的n可以是任意正整数,以满足不同仿真模型具有不同数目的输入、输出、可配置参数和内部状态数据的需求。
表1通用数据交互模型映射表结构
上述结构的通用数据交互模型具有通用性,可以实现对不同数目和不同数据类型的数据进行统一表示;同时,利用该通用数据交互模型,使得任何仿真模型的数据接口对外只表现为4个具有上述映射表形式的数据结构,即输入数据映射表、输出数据映射表、可配置参数表和内部状态数据表,从而实现仿真模型数据接口的统一。
本发明采用自顶向下的结构,逐渐细化的方式对通用数据交互模型进行构建,所述的构建方法自顶向下包含多层,具体为:
步骤101)利用HLA协议中提供的可变长数组类型HLAvariableArray对通用数据交互模型表示为可变长数组,该可变长数组中的各元素表示通用数据交互模型中的一行,即一个数据记录;所述的通用数据交互模型为若干行数据记录组合而成的映射表,每一行数据记录均包括标识和数据项,分别用于标识数据和存储数据的值;
步骤102)利用HLA协议中提供的固定记录类型HLAfixedRecord,表示通用数据交互模型的数据记录,将步骤101)中可变长数组中的各元素类型表示为HLAfixedRecord类型;所述的固定记录类型包含标识和数据项两个域,标识域利用HLA协议中提供的字符串类型HLAunicodeString表示,代表通用数据交互模型中数据记录的标识;数据项域用HLA协议中提供的字节数组类型HLAopaqueData表示,代表通用数据模型中数据记录的数据项,其直接来自通用数据交互模型中数据项的数据编码生成的字节流数据VariableLengthData;
步骤103)结合HLA协议,将通用数据交互模型中记录的各数据项可能出现的数据类型分为3类,包括简单数据类型、数组数据类型和结构数据类型;
步骤104)利用HLA协议中提供的固定记录类型HLAfixedRecord对步骤103)中划分获得的简单数据、数组数据和结构数据编码生成的字节流数据VariableLengthData进行表示,该固定记录类型包含数据类型标识域和数据域,其中,所述的数据类型标识域为字符串类型,用于记录数据本身的类型信息,利用HLA协议提供的字符串类型HLAunicodeString表示;所述的数据域为字节数组类型,利用HLA协议提供的字节数组类型HLAopaqueData表示;
步骤105)对于步骤104)中的数组数据或结构数据的数据域,利用HLA协议中提供的可变长数组HLAvariableArray来表示为可变长数组,并利用HLA协议中提供的字节数组类型HLAopaqueData将可变长数组的各元素类型表示为HLAopaqueData类型,HLAvariableArray中元素的类型为HLAopaqueData类型,其内容来自原始数组数据或原始结构数据对应位置元素编码生成的字节流数据VariableLengthData;
步骤106)将原始数组数据或原始结构数据对应位置元素编码生成的字节流数据VariableLengthData按步骤103)进行数据类型划分,如果划分为简单数据,则停止操作,如果仍划分为数组数据或结构数据,则重新执行步骤104)。
由于数组数据和结构数据中包含的数据同样可以采用与步骤104)中相同的方法进行处理,因此,可以对数组中包含数组、数组中包含结构、结构中包含结构和结构中包含数组的复杂数据类型实现递归编码和解码。
基于上述结构的通用数据交互模型,所述的简单数据类型包括:16位整型、32位整型、64位整型、单精度浮点数、双精度浮点数、BOOL型、ASCII码字符、Unicode字符、字节型、ASCII码字符串和Unicode字符串,并依次利用HLA协议中提供的HLAinteger16BE、HLAinteger32BE、HLAinteger64BE、HLAfloat32BE、HLAfloat64BE、HLAboolean、HLAASCIIchar、HLAunicodeChar、HLAbyte、HLAASCIIstring和HLAunicodeString进行表示。
由HLA协议提供的各数据类型与其对应的标识字符串分配如表2所示:
表2数据类型表示字符串
以上为本发明中提供的通用数据交互模型的构建方法,该构建方法充分利用HLA协议OMT标准提供的各数据类型完成了通用数据交互模型的转化和表示。首先,利用HLA提供的可变长数组和固定记录类型实现通用数据交互模型映射表数据结构的表示;然后,将通用数据交互模型中的数据项定义为字节数组类型;最后,将任意类型,包括简单数据类型、数组数据类型、结构数据类型转化成字节流数据,从而实现通用数据交互模型中数据项对多种不同类型数据的表示。为了在将数据转化成字节流数据时不丢失数据的类型信息,在转化前对数据的类型信息进行了标识。
本发明中的应用于HLA仿真系统的通用数据交互模型进行数据编码/解码操作,主要建立在HLA协议标准提供的数据类型及其编码/解码方法的基础上。HLA协议标准提供了Java API和C++API两种形式的接口声明文件,它们是HLA协议标准的一部分。在具体实施过程中,利用HLA Evolved版协议标准提供的C++API详细叙述实施本发明中通用数据交互模型进行编码/解码的流程。
HLA协议中的C++API由一系列C++头文件组成,其中与数据类型相关的头文件主要对OMT中预定义数据类型以C++类的形式进行编码/解码相关的接口声明,包括整型、浮点型、字符型、字符串型、变长数组型、固定记录型、可变记录型,其中,整型和浮点型还分大端模式和小端模式,在本实施例中采用大端模式。所有数据类型都拥有共同的基类,其类名为DataElement。DataElement为抽象类,它定义了与HLA数据类型编码/解码相关的公共接口,其中最重要的接口为编码接口(接口名为encode)和解码接口(接口名为decode)。因此,DataElement的子类也称为编码/解码助手(encode/decode helper),专门实现数据类型的编码/解码操作。在HLA协议提供的C++API头文件中还定义了一个与数据编码/解码相关的类,其类名为VariableLengthData,用于存放编码生成字节流数据。因此,VariableLengthData是编码/解码助手的encode接口的返回参数的类型,decode接口的输入参数类型。表3中列举了本实施例中所涉及的数据类型及其在C++API头文件中的类名,如下表所示:
表3数据类型的C++类名
下面说明在HLA Evolved版C++API定义的编码/解码助手的基础上,实现本发明中通用数据交互模型的编码/解码方法的过程,主要涉及编码和解码两方面的内容。
1.编码实施过程
本发明中的编码过程是将通用数据交互模型中的存放的仿真模型应用层数据按照图1所示的模型结构,转化为HLA协议中的变长数组类型(HLAvariableArray),从而利用HLAvariableArray的编码接口进一步将应用层数据转化为符合HLA协议标准的字节流数据,即用VariableLengthData表示的数据。所述的编码方法具体包括:
步骤201)创建类型为HLAvariableArray的模型port_va,将其各元素类型表示为HLAfixedRecord类型,并且将HLAfixedRecord类型中的标识域表示为HLAunicodeString类型,将数据项域表示为HLAopaqueData类型,利用模型port_va存储通用数据交互模型转化生成的HLAvariableArray类型的数据;
步骤202)读取通用数据交互模型的映射表中一个未处理的数据记录行,获得该数据记录行的标识和数据项;
步骤203)判断数据记录行中数据项的数据类型,如果判断为数组数据类型则转到步骤204);如果判断为结构数据类型则转到步骤211);如果判断为简单数据类型则转到步骤218);
步骤204)创建类型为HLAvariableArray的模型encode_va,并将其数组元素类型初始化为HLAopaqueData类型;
步骤205)读取数组数据中一个未处理的数组元素,判断数组元素的数据类型;
步骤206)如果步骤205)中读取的数组元素为数组数据类型,则转到步骤204),以处理数组数据相同的步骤处理其数组元素;如果步骤205)中读取的数组元素为结构数据类型,则转到步骤211),以处理结构数据相同的步骤处理该数组元素;如果步骤205)中读取的数组元素为简单数据类型,则转到步骤218),以处理简单数据相同的步骤处理该数组元素;经过多次递归迭代,直到最终以VariabLengthData类型返回数组元素编码生成的字节流;
步骤207)创建类型为HLAopaqueData的模型ele_opa,并利用步骤206)中返回的VariabLengthData类型数据初始化模型ele_opa;将初始化后的模型ele_opa添加到步骤204)定义的模型encode_va中;
步骤208)判断数组数据中所有元素是否已经处理完成,如果存在未处理的元素,则转到步骤205);否则,转到步骤209);
步骤209)创建类型为HLAfixedRecord的模型data_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为数组类型标识字符串“va”;将其第二个数据域初始化为HLAvariableArray类型,并赋值为步骤204)定义的encode_va;
步骤210)创建类型为HLAopaqueData的模型data_opa,调用步骤209)创建的模型data_rec中的编码接口,编码生成VariableLengthData类型的字节流数据,并利用该字节流数据初始化模型data_opa后,转到步骤222);
步骤211)创建类型为HLAvariableArray的模型encode_va,并将其数组元素类型初始化为HLAopaqueData类型;
步骤212)读取结构数据中一个未处理的数据域,判断数据域的数据类型;
步骤213)如果步骤212)中读取的数据域为数组数据类型,则转到步骤204),以处理数组数据相同的步骤处理该数据域;如果步骤212)中读取的数据域为结构数据类型,则转到步骤211),以处理结构数据相同的步骤处理其数据域;如果步骤212)中读取的数据域为简单数据类型,则转到步骤218),以处理简单数据相同的步骤处理该数据域;经过多次递归迭代,直到最终以VariabLengthData的类型返回数据域编码生成的字节流;
步骤214)创建类型为HLAopaqueData的模型ele_opa,并利用步骤213)中返回的VariabLengthData类型数据初始化ele_opa;将初始化后的模型ele_opa添加到步骤211)定义的模型encode_va中;
步骤215)判断结构数据中所有的数据域是否已经处理完成,如果存在未处理的数据域,则转到步骤212);否则,转到步骤216);
步骤216)创建类型为HLAfixedRecord的模型data_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为结构类型标识字符串“st”;将其第二个数据域初始化为HLAvariableArray类型,并赋值为步骤211)定义的encode_va;
步骤217)创建类型为HLAopaqueData的模型data_opa,调用步骤216)创建的模型data_rec中的编码接口,编码生成VariableLengthData类型的字节流数据,并利用该字节流数据初始化模型data_opa后,转到步骤222);
步骤218)根据简单数据类型的分类,将数据记录行中数据项划分为不同的子类,按照子类对应的C++类创建模型,并初始化为数据项的实际值后,调用模型中的编码接口,编码生成VariableLengthData类型的字节流数据;
步骤219)创建类型为HLAopaqueData的模型ele_opa,并利用步骤218)中返回的VariabLengthData类型数据初始化ele_opa;
步骤220)创建类型为HLAfixedRecord的模型data_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为简单数据类型标识字符串,该简单数据类型标识字符串与数据项的子类类型一致;将第二个数据域初始化为HLAopaqueData类型,并赋值为步骤219)定义的ele_opa;
步骤221)创建类型为HLAopaqueData的模型data_opa,调用步骤220)创建的模型data_rec中的编码接口,编码生成VariableLengthData类型的字节流数据,并利用该字节流数据初始化模型data_opa后,转到步骤222);
步骤222)创建类型为HLAfixedRecord的模型port_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为步骤202)中数据记录行的标识;将其第二个数据域初始化为HLAopaqueData类型,赋值为来自步骤210)或步骤217)或步骤221)中的data_opa,将port_rec添加到步骤201)创建的port_va中;
步骤223)判断通用数据交互模型的映射表中所有数据记录行是否处理完成,如果存在未处理的数据记录行,则转到步骤202);否则,转到步骤224);
步骤224)调用步骤201)创建的模型port_va中的编码接口,编码生成VariablengthData类型的字节流数据,至此,完成了通用数据交互模型中的数据到字节流数据的编码工作。
2.解码实施过程
本发明中的解码过程是从编码生成的VariableLengthData形式的字节流数据中按照图1所示的模型结构,提取出通用数据交互模型中的数据记录,为前面编码过程的逆过程。所述的解码方法具体包括:
步骤301)创建类型为HLAvariableArray的模型port_va,将其存放的各元素类型表示为HLAfixedRecord类型,并且将该HLAfixedRecord类型中的标识域表示为HLAunicodeString类型,将数据项域表示为HLAopaqueData类型;
步骤302)调用模型port_va中的解码接口,并以被解码的VariableLengthData类型的数据作为解码接口的输入参数,实现将字节流数据解码为步骤301)中所定义的数据类型;
步骤303)读取模型port_va中一个未处理的元素,存储于变量data_rec中;
步骤304)读取变量data_rec的第二个数据域,即类型为HLAopaqueData的数据域,将其存放在变量data_opa中;
步骤305)将变量data_opa中的字节流数据提取出来,并存放到类型为VariableLengthData的变量data_vld中;
步骤306)创建类型为HLAfixedRecord的模型trans_rec,将其第一个数据域初始化为HLAunicodeString类型;
步骤307)调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤308)读取模型trans_rec的第一个数据域,该第一个数据域表示为HLAunicodeString类型,将其存放到变量type_str中;
步骤309)判断变量type_str的值,如果为字符串“va”,则表明数据为数组数据类型,转到步骤310);如果为字符串“st”,则表明数据为结构数据类型,转到步骤318);否则,表明数据为简单数据类型,转到步骤326);
步骤310)创建类型为HLAvariableArray的模型data_va,其存放的数据元素为HLApaqueData类型;
步骤311)将步骤306)中创建的模型trans_rec的第二个数据域初始化为与步骤310)中模型data_va相同的数据类型,即数据元素为HLApaqueData类型的HLAvariableArray类型;
步骤312)再次调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤313)获取模型trans_rec的第二个数据域中的数据,将其赋值给步骤310)创建的模型data_va;
步骤314)读取步骤310)创建的模型data_va中一个未处理的元素,将其存放在类型为HLAopaqueData的变量ele_opa中,转到步骤305),以处理变量data_opa相同的步骤处理ele_opa;经过多次迭代,完成步骤310)创建的模型data_va中一个元素的解码,解码后返回值为DataElement的某一子类,在C++中可以用DataElement引用类型进行统一表示;
步骤315)将步骤314)中解码返回的值添加到类型为HLAvariableArray的变量dec_ele_va中;
步骤316)判断步骤310)创建的模型data_va中的所有元素是否已经处理完成,如果存在未处理的元素,转到步骤314);否则,转到步骤317);
步骤317)读取步骤303)中定义的变量data_rec的第一个数据域,该数据域为HLAunicodeString类型,其值为通用数据交互模型中数据记录行的标识,读取步骤315)中定义的变量dec_ele_va的值,其值即为通用数据交互模型中数据记录行的数据项,从而完成一个数据记录行的解码后,转到步骤332);
步骤318)创建类型为HLAvariableArray的模型data_va,其存放的数据元素为HLApaqueData类型;
步骤319)将步骤306)中创建的模型trans_rec的第二个数据域初始化为与步骤310)中模型data_va相同的数据类型,即数据元素为HLApaqueData类型的HLAvariableArray类型;
步骤320)再次调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤321)获取模型trans_rec的第二个数据域中的数据,将其赋值给步骤318)创建的模型data_va;
步骤322)读取步骤318)创建的模型data_va中一个未处理的元素,将其存放在类型为HLAopaqueData的变量ele_opa中,转到步骤305),以处理变量data_opa相同的步骤处理ele_opa;经过多次迭代,完成步骤318)创建的模型data_va中一个元素的解码,解码后返回值为DataElement的某一子类,在C++中可以用DataElement引用类型进行统一表示;
步骤323)将步骤322)中解码返回的值添加到类型为HLAfixedRecord的变量dec_ele_rec中;
步骤324)判断步骤318)创建的模型data_va中的所有元素是否已经处理完成,如果存在未处理的元素,转到步骤322);否则,转到步骤325);
步骤325)读取步骤303)中定义的变量data_rec的第一个数据域,该数据域为HLAunicodeString类型,其值为通用数据交互模型中数据记录行的标识,读取步骤323)中定义的变量dec_ele_rec的值,其值即为通用数据交互模型中数据记录行的数据项,从而完成一个数据记录行的解码后,转到步骤332);
步骤326)将步骤306)中创建的模型trans_rec的第二个数据域初始化为HLAopaqueData类型;
步骤327)再次调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤328)获取模型trans_rec的第二个数据域中的数据,将其赋值给类型为HLAopaqueData的变量dec_opa,将该变量dec_opa中存放的字节数据提取出来后存放在类型为VariableLengthData的变量dec_vld中;
步骤329)根据步骤308)定义的变量type_str的值,确定由简单数据类型所划分的子类,创建与该子类相应的数据类型模型dec_bsc,比如type_str的值为“i2”,则创建HLAinteger16的实例;
步骤330)调用数据类型模型dec_bsc中的解码接口,以变量dec_vld作为输入参数,完成简单数据类型的解码工作;
步骤331)读取步骤303)中定义的变量data_rec的第一个数据域,该数据域为HLAunicodeString类型,其值为通用数据交互模型中数据记录行的标识,读取步骤330)中定义的数据类型模型dec_bsc的值,其值即为通用数据交互模型中数据记录行的数据项,从而完成一个数据记录行的解码后,转到步骤332);
步骤332)判断步骤301)定义的模型port_va中的所有元素是否已经处理完,如果存在未处理的元素,则转到步骤303);否则,判定完成了通用数据交互模型中的字节流数据的解码工作。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。
Claims (4)
1.一种通用数据交互模型的构建方法,其特征在于,包括:
步骤101)利用HLA协议中提供的可变长数组类型HLAvariableArray将通用数据交互模型表示为可变长数组,该可变长数组中的各元素表示通用数据交互模型中的一个数据记录;所述的通用数据交互模型为若干行数据记录组合而成的映射表,每一行数据记录均包括标识和数据项,分别用于标识数据和存储数据的值;
步骤102)利用HLA协议中提供的固定记录类型HLAfixedRecord将步骤101)中可变长数组的各元素类型表示为HLAfixedRecord类型;所述的固定记录类型包含标识域和数据项域,标识域利用HLA协议中提供的字符串类型HLAunicodeString表示,代表通用数据交互模型中数据记录的标识,数据项域利用HLA协议中提供的字节数组类型HLAopaqueData表示,代表通用数据交互模型中数据记录的数据项,该数据项域存储通用数据交互模型中数据项的数据编码生成的字节流数据VariableLengthData;
步骤103)根据HLA协议,将通用数据交互模型中记录的各数据项按简单数据类型、数组数据类型和结构数据类型分别划分为简单数据、数组数据和结构数据;
步骤104)利用HLA协议中提供的固定记录类型HLAfixedRecord对步骤103)中的简单数据、数组数据和结构数据编码生成的字节流数据VariableLengthData进行表示,该固定记录类型包含数据类型标识域和数据域,所述的数据类型标识域为字符串类型,利用HLA协议提供的字符串类型HLAunicodeString表示,用于记录数据本身的类型信息,所述的数据域为字节数组类型,利用HLA协议提供的字节数组类型HLAopaqueData表示;
步骤105)对于步骤104)中数组数据或结构数据的数据域,利用HLA协议中提供的可变长数组类型HLAvariableArray表示为可变长数组,并利用HLA协议中提供的字节数组类型HLAopaqueData将可变长数组的各元素类型表示为HLAopaqueData类型,各元素存储原始数组数据或原始结构数据对应位置元素编码生成的字节流数据VariableLengthData;
步骤106)将原始数组数据或原始结构数据对应位置元素编码生成的字节流数据VariableLengthData按步骤103)进行数据类型划分,如果划分为简单数据,则停止操作,如果仍划分为数组数据或结构数据,则重新执行步骤104)。
2.根据权利要求1所述的通用数据交互模型的构建方法,其特征在于,所述的简单数据类型包括:16位整型、32位整型、64位整型、单精度浮点数、双精度浮点数、BOOL型、ASCII码字符、Unicode字符、字节型、ASCII码字符串和Unicode字符串,并依次利用HLA协议中提供的类型HLAinteger16BE、HLAinteger32BE、HLAinteger64BE、HLAfloat32BE、HLAfloat64BE、HLAboolean、HLAASCIIchar、HLAunicodeChar、HLAbyte、HLAASCIIstring和HLAunicodeString进行表示。
3.基于权利要求1-2之一所述的通用数据交互模型的编码方法,其特征在于,包括:
步骤201)创建类型为HLAvariableArray的模型port_va,将其各元素类型表示为HLAfixedRecord类型,并且将HLAfixedRecord类型中的标识域表示为HLAunicodeString类型,将数据项域表示为HLAopaqueData类型,利用模型port_va存储通用数据交互模型转化生成的HLAvariableArray类型的数据;
步骤202)读取通用数据交互模型的映射表中一个未处理的数据记录行,获得该数据记录行的标识和数据项;
步骤203)判断数据记录行中数据项的数据类型,如果判断为数组数据类型则转到步骤204);如果判断为结构数据类型则转到步骤211);如果判断为简单数据类型则转到步骤218);
步骤204)创建类型为HLAvariableArray的模型encode_va,并将其数组元素类型初始化为HLAopaqueData类型;
步骤205)读取数组数据中一个未处理的数组元素,判断数组元素的数据类型;
步骤206)如果步骤205)中读取的数组元素为数组数据类型,则转到步骤204),以处理数组数据相同的步骤处理其数组元素;如果步骤205)中读取的数组元素为结构数据类型,则转到步骤211),以处理结构数据相同的步骤处理该数组元素;如果步骤205)中读取的数组元素为简单数据类型,则转到步骤218),以处理简单数据相同的步骤处理该数组元素;经过多次递归迭代,直到最终以VariabLengthData类型返回数组元素编码生成的字节流;
步骤207)创建类型为HLAopaqueData的模型ele_opa,并利用步骤206)中返回的VariabLengthData类型数据初始化模型ele_opa;将初始化后的模型ele_opa添加到步骤204)定义的模型encode_va中;
步骤208)判断数组数据中所有元素是否已经处理完成,如果存在未处理的元素,则转到步骤205);否则,转到步骤209);
步骤209)创建类型为HLAfixedRecord的模型data_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为数组类型标识字符串“va”;将其第二个数据域初始化为HLAvariableArray类型,并赋值为步骤204)定义的encode_va;
步骤210)创建类型为HLAopaqueData的模型data_opa,调用步骤209)创建的模型data_rec中的编码接口,编码生成VariableLengthData类型的字节流数据,并利用该字节流数据初始化模型data_opa后,转到步骤222);
步骤211)创建类型为HLAvariableArray的模型encode_va,并将其数组元素类型初始化为HLAopaqueData类型;
步骤212)读取结构数据中一个未处理的数据域,判断数据域的数据类型;
步骤213)如果步骤212)中读取的数据域为数组数据类型,则转到步骤204),以处理数组数据相同的步骤处理该数据域;如果步骤212)中读取的数据域为结构数据类型,则转到步骤211),以处理结构数据相同的步骤处理其数据域;如果步骤212)中读取的数据域为简单数据类型,则转到步骤218),以处理简单数据相同的步骤处理该数据域;经过多次递归迭代,直到最终以VariabLengthData的类型返回数据域编码生成的字节流;
步骤214)创建类型为HLAopaqueData的模型ele_opa,并利用步骤213)中返回的VariabLengthData类型数据初始化ele_opa;将初始化后的模型ele_opa添加到步骤211)定义的模型encode_va中;
步骤215)判断结构数据中所有的数据域是否已经处理完成,如果存在未处理的数据域,则转到步骤212);否则,转到步骤216);
步骤216)创建类型为HLAfixedRecord的模型data_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为结构类型标识字符串“st”;将其第二个数据域初始化为HLAvariableArray类型,并赋值为步骤211)定义的encode_va;
步骤217)创建类型为HLAopaqueData的模型data_opa,调用步骤216)创建的模型data_rec中的编码接口,编码生成VariableLengthData类型的字节流数据,并利用该字节流数据初始化模型data_opa后,转到步骤222);
步骤218)根据简单数据类型的分类,将数据记录行中数据项划分为不同的子类,按照子类对应的C++类创建模型,并初始化为数据项的实际值后,调用模型中的编码接口,编码生成VariableLengthData类型的字节流数据;
步骤219)创建类型为HLAopaqueData的模型ele_opa,并利用步骤218)中返回的VariabLengthData类型数据初始化ele_opa;
步骤220)创建类型为HLAfixedRecord的模型data_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为简单数据类型标识字符串,该简单数据类型标识字符串与数据项的子类类型一致;将第二个数据域初始化为HLAopaqueData类型,并赋值为步骤219)定义的ele_opa;
步骤221)创建类型为HLAopaqueData的模型data_opa,调用步骤220)创建的模型data_rec中的编码接口,编码生成VariableLengthData类型的字节流数据,并利用该字节流数据初始化模型data_opa后,转到步骤222);
步骤222)创建类型为HLAfixedRecord的模型port_rec,将其第一个数据域初始化为HLAunicodeString类型,赋值为步骤202)中数据记录行的标识;将其第二个数据域初始化为HLAopaqueData类型,赋值为来自步骤210)或步骤217)或步骤221)中的data_opa,将port_rec添加到步骤201)创建的port_va中;
步骤223)判断通用数据交互模型的映射表中所有数据记录行是否处理完成,如果存在未处理的数据记录行,则转到步骤202);否则,转到步骤224);
步骤224)调用步骤201)创建的模型port_va中的编码接口,编码生成VariablengthData类型的字节流数据,至此,完成了通用数据交互模型中的数据到字节流数据的编码工作。
4.基于权利要求1-2之一所述的通用数据交互模型的解码方法,其特征在于,包括:
步骤301)创建类型为HLAvariableArray的模型port_va,将其存放的各元素类型表示为HLAfixedRecord类型,并且将该HLAfixedRecord类型中的标识域表示为HLAunicodeString类型,将数据项域表示为HLAopaqueData类型;
步骤302)调用模型port_va中的解码接口,并以被解码的VariableLengthData类型的数据作为解码接口的输入参数,实现将字节流数据解码为步骤301)中所定义的数据类型;
步骤303)读取模型port_va中一个未处理的元素,存储于变量data_rec中;
步骤304)读取变量data_rec的第二个数据域,即类型为HLAopaqueData的数据域,将其存放在变量data_opa中;
步骤305)将变量data_opa中的字节流数据提取出来,并存放到类型为VariableLengthData的变量data_vld中;
步骤306)创建类型为HLAfixedRecord的模型trans_rec,将其第一个数据域初始化为HLAunicodeString类型;
步骤307)调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤308)读取模型trans_rec的第一个数据域,该第一个数据域表示为HLAunicodeString类型,将其存放到变量type_str中;
步骤309)判断变量type_str的值,如果为字符串“va”,则表明数据为数组数据类型,转到步骤310);如果为字符串“st”,则表明数据为结构数据类型,转到步骤318);否则,表明数据为简单数据类型,转到步骤326);
步骤310)创建类型为HLAvariableArray的模型data_va,其存放的数据元素为HLApaqueData类型;
步骤311)将步骤306)中创建的模型trans_rec的第二个数据域初始化为与步骤310)中模型data_va相同的数据类型,即数据元素为HLApaqueData类型的HLAvariableArray类型;
步骤312)再次调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤313)获取模型trans_rec的第二个数据域中的数据,将其赋值给步骤310)创建的模型data_va;
步骤314)读取步骤310)创建的模型data_va中一个未处理的元素,将其存放在类型为HLAopaqueData的变量ele_opa中,转到步骤305),以处理变量data_opa相同的步骤处理ele_opa;经过多次迭代,完成步骤310)创建的模型data_va中一个元素的解码,解码后返回值为DataElement的某一子类;
步骤315)将步骤314)中解码返回的值添加到类型为HLAvariableArray的变量dec_ele_va中;
步骤316)判断步骤310)创建的模型data_va中的所有元素是否已经处理完成,如果存在未处理的元素,转到步骤314);否则,转到步骤317);
步骤317)读取步骤303)中定义的变量data_rec的第一个数据域,该数据域为HLAunicodeString类型,其值为通用数据交互模型中数据记录行的标识,读取步骤315)中定义的变量dec_ele_va的值,其值即为通用数据交互模型中数据记录行的数据项,从而完成一个数据记录行的解码后,转到步骤332);
步骤318)创建类型为HLAvariableArray的模型data_va,其存放的数据元素为HLApaqueData类型;
步骤319)将步骤306)中创建的模型trans_rec的第二个数据域初始化为与步骤310)中模型data_va相同的数据类型,即数据元素为HLApaqueData类型的HLAvariableArray类型;
步骤320)再次调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤321)获取模型trans_rec的第二个数据域中的数据,将其赋值给步骤318)创建的模型data_va;
步骤322)读取步骤318)创建的模型data_va中一个未处理的元素,将其存放在类型为HLAopaqueData的变量ele_opa中,转到步骤305),以处理变量data_opa相同的步骤处理ele_opa;经过多次迭代,完成步骤318)创建的模型data_va中一个元素的解码,解码后返回值为DataElement的某一子类;
步骤323)将步骤322)中解码返回的值添加到类型为HLAfixedRecord的变量dec_ele_rec中;
步骤324)判断步骤318)创建的模型data_va中的所有元素是否已经处理完成,如果存在未处理的元素,转到步骤322);否则,转到步骤325);
步骤325)读取步骤303)中定义的变量data_rec的第一个数据域,该数据域为HLAunicodeString类型,其值为通用数据交互模型中数据记录行的标识,读取步骤323)中定义的变量dec_ele_rec的值,其值即为通用数据交互模型中数据记录行的数据项,从而完成一个数据记录行的解码后,转到步骤332);
步骤326)将步骤306)中创建的模型trans_rec的第二个数据域初始化为HLAopaqueData类型;
步骤327)再次调用模型trans_rec中的解码接口,并以步骤305)中的变量data_vld作为输入参数;
步骤328)获取模型trans_rec的第二个数据域中的数据,将其赋值给类型为HLAopaqueData的变量dec_opa,将该变量dec_opa中存放的字节数据提取出来后存放在类型为VariableLengthData的变量dec_vld中;
步骤329)根据步骤308)定义的变量type_str的值,确定由简单数据类型所划分的子类,创建与该子类相应的数据类型模型dec_bsc;
步骤330)调用数据类型模型dec_bsc中的解码接口,以变量dec_vld作为输入参数,完成简单数据类型的解码工作;
步骤331)读取步骤303)中定义的变量data_rec的第一个数据域,该数据域为HLAunicodeString类型,其值为通用数据交互模型中数据记录行的标识,读取步骤330)中定义的数据类型模型dec_bsc的值,其值即为通用数据交互模型中数据记录行的数据项,从而完成一个数据记录行的解码后,转到步骤332);
步骤332)判断步骤301)定义的模型port_va中的所有元素是否已经处理完,如果存在未处理的元素,则转到步骤303);否则,判定完成了通用数据交互模型中的字节流数据的解码工作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611183614.3A CN106844855A (zh) | 2016-12-20 | 2016-12-20 | 一种通用数据交互模型构建、基于该模型编码及解码方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611183614.3A CN106844855A (zh) | 2016-12-20 | 2016-12-20 | 一种通用数据交互模型构建、基于该模型编码及解码方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106844855A true CN106844855A (zh) | 2017-06-13 |
Family
ID=59140561
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611183614.3A Pending CN106844855A (zh) | 2016-12-20 | 2016-12-20 | 一种通用数据交互模型构建、基于该模型编码及解码方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106844855A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109525364A (zh) * | 2018-10-30 | 2019-03-26 | 北京计算机技术及应用研究所 | 一种基于xml的通信数据协议通用化描述方法 |
CN110515744A (zh) * | 2019-08-14 | 2019-11-29 | 北京邮电大学 | 一种航天器软件信息交互的方法 |
US11061880B2 (en) | 2018-01-25 | 2021-07-13 | Hewlett-Packard Development Company, L.P. | Data structure with identifiers |
-
2016
- 2016-12-20 CN CN201611183614.3A patent/CN106844855A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11061880B2 (en) | 2018-01-25 | 2021-07-13 | Hewlett-Packard Development Company, L.P. | Data structure with identifiers |
CN109525364A (zh) * | 2018-10-30 | 2019-03-26 | 北京计算机技术及应用研究所 | 一种基于xml的通信数据协议通用化描述方法 |
CN110515744A (zh) * | 2019-08-14 | 2019-11-29 | 北京邮电大学 | 一种航天器软件信息交互的方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106528165B (zh) | 代码生成方法及代码生成系统 | |
CN106777292B (zh) | 一种数据序列化方法及装置 | |
Bowen et al. | High-integrity system specification and design | |
CN101841515B (zh) | 可变目标的协议数据单元编解码代码自动生成的实现方法 | |
CN105701253A (zh) | 中文自然语言问句语义化的知识库自动问答方法 | |
CN107273117A (zh) | 一种编程友好型的敏捷代码自动生成系统 | |
CN106844855A (zh) | 一种通用数据交互模型构建、基于该模型编码及解码方法 | |
CN104461531B (zh) | 一种报表系统自定义函数的实现方法 | |
CN108694214A (zh) | 数据报表的生成方法、生成装置、可读介质及电子设备 | |
CN112860260B (zh) | 一种在高校场景下基于web的跨平台应用构建工具及方法 | |
CN103034499A (zh) | 机载设备网络数据传输通用的数据格式转换方法及其系统 | |
CN110162297A (zh) | 一种源代码段自然语言描述自动生成方法及系统 | |
CN109241104A (zh) | 决策型分布式数据库系统中aisql的解析器及其实现方法 | |
US9652478B2 (en) | Method and apparatus for generating an electronic document schema from a relational model | |
CN104750468B (zh) | 一种服务端拓扑数据转换方法和转换装置 | |
CN114138243A (zh) | 基于开发平台的功能调用方法、装置、设备及存储介质 | |
CN115496166A (zh) | 多任务处理方法、装置、电子设备及存储介质 | |
CN101246473B (zh) | 一种分词系统的评测方法和一种分词评测系统 | |
Bicevskis et al. | Practitioners view on domain specific business process modeling | |
CN105955066A (zh) | 一种仿真系统中通用的模型数据编码和解码方法 | |
Saba et al. | An ontology-driven framework for enhancing reusability of distributed simulation modeling of industrial construction processes | |
CN106933564A (zh) | 通过Fitler模型及注解扩展实现ECP平台数据访问的查询方法 | |
CN109062566B (zh) | 数字航天器波道遥测源代码人工智能书写方法 | |
GB2348970A (en) | Maintenance of a system model in computer-aided design | |
Pastor et al. | An ontological-based approach to analyze software production methods |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20170613 |
|
RJ01 | Rejection of invention patent application after publication |