一种基于xml的协议动态组包和解析方法

文档序号:486952 发布日期:2022-01-04 浏览:5次 >En<

阅读说明:本技术 一种基于xml的协议动态组包和解析方法 (XML-based protocol dynamic packaging and analyzing method ) 是由 何舒 辜彬 葛泽文 江红 于 2021-10-20 设计创作,主要内容包括:本发明提供一种基于XML的协议动态组包和解析方法,包括:在协议模板的XML文件中定义关键字来表示协议动态组包和解析的交互流程;再通过解析协议模板的XML文件中的关键字来模拟协议动态组包和解析。本发明的有益效果是:1、对于各种自定义协议,只要在协议模板的XML文件中通过关键字对协议格式及业务动作进行定义,即可通过解析XML的关键字实现协议流程交互,即协议动态组包和解析;2、关键字和运算调用的基础函数和业务函数等可根据业务需要进行扩展,兼容性和可扩展性好;3、使用本发明进行实时动态组包和解析,被测设备无需做出任何改动。(The invention provides a protocol dynamic packaging and analyzing method based on XML, which comprises the following steps: defining keywords in an XML file of a protocol template to represent an interactive flow of protocol dynamic packaging and analysis; and simulating the dynamic package and analysis of the protocol by analyzing the keywords in the XML file of the protocol template. The invention has the beneficial effects that: 1. for various self-defined protocols, as long as the protocol format and the service action are defined in the XML file of the protocol template through keywords, the protocol flow interaction, namely the protocol dynamic packaging and analysis, can be realized by analyzing the keywords of the XML; 2. keywords, basic functions called by operation, service functions and the like can be expanded according to service requirements, and compatibility and expandability are good; 3. the invention is used for real-time dynamic packaging and analysis, and the tested equipment does not need to be changed.)

一种基于XML的协议动态组包和解析方法

技术领域

本发明涉及协议解析技术领域,具体而言,涉及一种基于XML的协议动态组包和解析方法。

背景技术

当前针对各种通用协议已有较为成熟的测试方法及测试工具。但如果协议格式为自定义的,则少有现成的测试方法可以对其进行协议测试。针对自定义协议,一般采用静态解析的方式验证其数据格式的正确性,但协议交互的异常用例难以构造。如果针对被测协议进行模拟组包,一般就要定制测试工具,把协议流程重新实现一遍。这样的做法不具有通用性,投入产出比较低。如何能根据协议交互过程中的实时数据进行动态组包,最大程度模拟真实协议数据,减少被测设备的改动,就成为成功进行协议动态测试要解决的重要问题。

发明内容

本发明旨在提供一种基于XML的协议动态组包和解析方法,以解决如何能根据协议交互过程中的实时数据进行动态组包,最大程度模拟真实协议数据,减少被测设备的改动的问题。

本发明提供的一种基于XML的协议动态组包和解析方法,包括:

在协议模板的XML文件中定义关键字来表示协议动态组包和解析的交互流程;

再通过解析协议模板的XML文件中的关键字来模拟协议动态组包和解析。

进一步的,通过解析协议模板的XML文件中的关键字来模拟协议动态组包的方法包括如下步骤:

(1)根据传入的协议模板名称及数据包名称,从内存中已加载的协议模板数据中通过匹配<Package>标签找到与传入的数据包名称相同的节点;

(2)依次循环解析数据包节点<Package>的子节点,根据定义的不同关键字进行不同的操作步骤,输出子节点的组包结果;

(3)当数据包节点<Package>节点下的所有子节点处理完成后,将每个子节点的组包结果按照协议模板定义的组包方式进行拼接,得到该数据包的组包结果。

进一步的,协议动态组包的方法中,依次循环解析数据包节点<Package>的子节点,根据定义的不同关键字进行不同的操作步骤,输出该子节点的组包结果的方法包括如下子步骤:

(2.1)若数据包节点<Package>的子节点的节点名为字段<Field>,则进入字段处理流程:根据协议模板中定义的字段属性,采用不同的数据生成方式,得到相应的组包结果;

(2.2)若数据包节点<Package>的子节点的节点名为准备区域<PreArea>,则进入准备区域处理流程:依次将该准备区域<PreArea>的所有子节点定义的数据读取到中间变量列表中,以备后续使用;

(2.3)若数据包节点<Package>的子节点的节点名为私有区域<PriArea>,则进入私有区域处理流程:依次对该私有区域<PriArea>的所有子节点进行处理,该私有区域<PriArea>的子节点为需要运算得出结果的单个字段,将运算结果存入中间变量列表中,仅用于中间数据运算,不计入组包结果;

(2.4)若数据包节点<Package>的子节点的节点名为标识区域<FlagArea>,则进入标识区域处理流程:依次对标识区域<FlagArea>的所有子节点进行处理,并将得到的子节点数据写入一个临时列表中,当该标识区域<FlagArea>的所有子节点处理完毕后,将临时列表中的子节点数据按照指定的数据拼接方式依次拼接,得到一个组包字符串,存入组包结果;

(2.5)若数据包节点<Package>的子节点的节点名为保护区域<ProArea>,则进入保护区域处理流程:依次对保护区域<ProArea>的所有子节点进行处理,并将得到的子节点数据写入一个临时列表中,当该保护区域<ProArea>的所有子节点处理完毕后,将临时列表中的子节点数据按照指定的数据拼接方式依次拼接,得到一个组包字符串,在依次处理完所有子节点得到组包字符串之后,根据协议模板的保护区域运算定义,对该组包字符串进行运算,将运算结果作为最后的组包结果;

(2.6)若数据包节点<Package>的子节点的节点名为循环区域<CycArea>,则进入循环区域处理流程:该循环区域处理流程包括一个嵌套循环,先根据协议模板定义的循环次数确定外层循环次数,再根据循环区域中子节点的个数确定内层循环次数,在内层循环中依次运算子节点的结果,每个子节点的结果会根据协议模板定义运算出固定结果;当两层循环处理完毕,将所有子节点的固定结果拼接得到循环区域的组包结果。

进一步的,当数据包节点<Package>的节点名为标识区域<FlagArea>时,若该标识区域<FlagArea>在后续其他地方参与运算,则通过协议模板定义的引用属性将标识区域<FlagArea>的组包结果写入中间变量列表,后续可以引用该中间变量列表中存储的标识区域<FlagArea>的组包结果,从而将该标识区域<FlagArea>的连续多个数据作为一个整体进行引用。

进一步的,当数据包节点<Package>的节点名为循环区域<CycArea>时,根据协议模板定义,加上内外循环次数作为子节点的结果的文件名后缀,以确保数据的唯一性;再根据协议模板定义,动态读取文件名连续的外部文件数据作为组包结果。

进一步的,通过解析协议模板的XML文件中的关键字来模拟协议动态解析的方法包括如下步骤:

(1)根据传入的协议模板名称及数据包名称,从内存中已加载的协议模板数据中通过匹配<Package>标签找到与传入的数据包名称相同的节点;

(2)依次循环遍历数据包节点<Package>的子节点,对协议模板进行预处理;

(3)协议预处理完成后,再次依次循环解析数据包节点<Package>的子节点,根据不同关键字进行不同的操作步骤,输出子节点的解析结果,并将解析结果记入解析结果列表中;

(4)数据包节点<Package>下的所有子节点处理完成后,将解析结果列表中的解析结果按照顺序依次输出到结果文件中,以备用户查看。

进一步的,对协议模板进行预处理的方法包括如下步骤:

(2.1)若数据包节点<Package>的子节点的节点名为被引用区域<RefArea>,则进入被引用区域处理流程:该被引用区域处理流程将被引用区域整个写入被引用数据中间变量列表中,供调用区域<CallArea>直接引用;

(2.2)若数据包节点<Package>的子节点的节点名为调用区域<CallArea>,则进入调用区域处理流程:该调用区域处理流程将根据该调用区域<CallArea>的节点值获取被引用区域的名称,从调用区域<CallArea>的id属性获取其子节点id的前缀信息,然后将被引用区域的所有子节点的id加上前缀信息进行更新后替换协议模板的调用区域内容。

进一步的,协议动态解析的方法中,依次循环解析数据包节点<Package>的子节点,根据不同关键字进行不同的操作步骤,输出子节点的解析结果的方法包括如下子步骤:

(3.1)若数据包节点<Package>的子节点的节点名为字段<Field>,则进入字段处理流程:根据字段长度及运算出的字段偏移获取字段实际值,或者根据字段分隔符获取字段实际值;若定义了字段预期值,则根据预期值的字段运算方式获取字段预期值;然后将字段实际值与字段预期值进行比对,若一致则流程继续进行,不一致则输出错误信息并终止解析流程;

(3.2)若数据包节点<Package>的子节点的节点名为准备区域<PreArea>,则进入准备区域处理流程:依次将准备区域<PreArea>的所有子节点定义的数据读取到中间变量列表中,以备后续使用;

(3.3)若数据包节点<Package>的子节点的节点名为私有区域<PriArea>,则进入私有区域处理流程:依次对该私有区域<PriArea>的所有子节点进行处理,该私有区域<PriArea>的子节点为需要运算得出结果的单个字段,将运算结果存入中间变量列表中,仅用于中间数据运算,不计入组包结果;

(3.4)若数据包节点<Package>的子节点的节点名为标识区域<FlagArea>,则进入标识区域处理流程:先根据协议模板定义获取该标识区域<FlagArea>的数据,再依次对标识区域<FlagArea>的所有子节点进行处理,并将得到的子节点数据写入一个临时列表中,当该标识区域<FlagArea>的所有子节点处理完毕后,将临时列表中的子节点数据按照顺序输出一个解析字符串到结果文件的XML文件中,便于用户查看;

(3.5)若数据包节点<Package>的子节点的节点名为保护区域<ProArea>,则进入保护区域处理流程:首先,根据保护区域的数据长度获取该保护区域解析前的数据,然后根据保护区域的运算信息子节点<CalcInfo>中定义的运算信息,将保护区域解析前的数据作为运算函数的输入参数,运算后得到解除保护后的数据;然后将解除保护后的数据按照保护区域的具体字段定义依次解析,得到该保护区域数据的最终解析结果;

(3.6)若数据包节点<Package>的子节点的节点名为循环区域<CycArea>,则进入循环区域处理流程:先根据协议模板定义的循环次数,实时动态生成本循环的协议模板,然后再获取循环区域<CycArea>的数据,并按照实时动态生成的本循环的协议模板,依次解析循环区域<CycArea>的各子节点,并输出解析结果;

(3.7)若数据包节点<Package>的子节点的节点名为子模板区域<SubArea>,则进入子模板区域处理流程:该子模板区域处理流程将根据协议模板定义的子模板名称,实时从内存中已加载的协议模板文件中匹配对应的子模板,然后将匹配到的子模板加入子模板临时列表中,以备后续直接引用;

(3.8)若数据包节点<Package>的子节点的节点名为选择区域<SelArea>,则进入选择区域处理流程:通过在协议模板中定义选择条件,及该选择条件下需要跳转的子模板名称,实现协议处理流程的分支判断及处理,满足选择条件则直接从子模板临时列表中匹配对应的子模板进行解析。

进一步的,整个标识区域<FlagArea>的数据,以及该标识区域<FlagArea>中的子节点获取方式一共有两种:

一种是根据该标识区域<FlagArea>的数据长度,以及运算出来的该标识区域<FlagArea>的数据偏移来获取数据,这种类型适用于数据是数值直接拼接的情况;

另一种是根据协议模板定义的分隔符来获取数据,这种类型适用于数据的拼接方式是带有格式的情况。

进一步的,选择条件有两种定义方式:

一种是前面已解析完毕的子节点,则选择条件指定为节点名称;

另一种是还未解析出的子节点,则根据该子节点的数据长度及相对偏移来获取数据。

综上所述,由于采用了上述技术方案,本发明的有益效果是:

1、对于各种自定义协议,只要在协议模板的XML文件中通过关键字对协议格式及业务动作进行定义,即可通过解析XML的关键字实现协议流程交互,即协议动态组包和解析;

2、关键字和运算调用的基础函数和业务函数等可根据业务需要进行扩展,兼容性和可扩展性好;

3、传统方式模拟收发包进行协议测试需要被测设备做出一些改动如:插桩输出数据,屏蔽某些身份认证操作,关闭抗重放功能等。而使用本发明进行实时动态组包和解析,被测设备无需做出任何改动。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本发明实施例的基于XML的协议动态组包和解析方法的流程图。

图2为本发明实施例的模拟协议动态组包的流程图。

图3为本发明实施例的模拟协议动态组包的字段处理流程的流程图。

图4为本发明实施例的模拟协议动态解析的流程图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。

因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例

如图1所示,本实施例提出一种基于XML的协议动态组包和解析方法,包括:

在协议模板的XML文件中定义关键字来表示协议动态组包和解析的交互流程;

再通过解析协议模板的XML文件中的关键字来模拟协议动态组包和解析。

具体地:

如图2所示,通过解析协议模板的XML文件中的关键字来模拟协议动态组包的方法包括如下步骤:

(1)根据传入的协议模板名称及数据包名称,从内存中已加载的协议模板数据中通过匹配<Package>标签找到与传入的数据包名称相同的节点。

(2)依次循环解析数据包节点<Package>的子节点,根据定义的不同关键字进行不同的操作步骤,输出子节点的组包结果:

(2.1)若数据包节点<Package>的子节点的节点名为字段<Field>,则进入字段处理流程:根据协议模板中定义的字段属性,采用不同的数据生成方式,得到相应的组包结果。如图3所示,其中:

(2.1.1)若数据生成方式为“数值”,则读取该字段的XML节点的值作为数据结果,但在输出该数据结果前,要先根据定义的数据类型及数据长度进行必要的数据填充及数据类型转换。若该数据结果在协议模板中定义为后续要被引用,还应将该数据结果以key-value的形式写入中间变量列表,以便后续从中间变量列表获取该数据结果。

(2.1.2)若该数据生成方式为“文件”,则从该字段的XML节点的值获取文件名,并从配置文件中指定的数据文件路径中读取指定文件名的文件,将文件内容作为组包结果。若该文件定义了递增后缀属性,还可以在固定的文件名后动态添加后缀,满足依次循环读取多个文件的需求。

(2.1.3)若该数据生成方式为“运算”,则根据其运算子节点<CalcInfo>的定义中获取运算相关信息(主要是外部函数名及输入输出参数定义),进行运算,将输出参数的数值或者函数返回值作为组包结果,两种方式通过运算子节点的输出数据属性来指定。

(2.1.4)若该数据生成方式为“引用数据”,则从该字段的XML节点的值获取被引用字段的名称,然后在中间变量列表中匹配名称相同的字段,取其字段值作为组包结果;

(2.1.5)若该数据生成方式为“引用长度”,则从该字段的XML节点的值获取被引用字段的名称,然后在中间变量列表中匹配名称相同的字段,取其字段长度作为组包结果;

(2.1.6)若该数据生成方式为“随机数”,则调用随机函数,生成指定长度的随机数作为组包结果;

(2.1.7)若该数据生成方式为“递增数”,则根据该字段的“递增初始值”和“递增步长”两个属性计算其递增结果,作为组包结果;

(2.1.8)若该数据生成方式为“系统时间”,则获取当前系统时间作为组包结果。

(2.2)若数据包节点<Package>的子节点的节点名为准备区域<PreArea>,则进入准备区域处理流程:依次将该准备区域<PreArea>的所有子节点定义的数据(主要是文件数据以及少量常量数据)读取到中间变量列表中,以备后续使用;

(2.3)若数据包节点<Package>的子节点的节点名为私有区域<PriArea>,则进入私有区域处理流程:依次对该私有区域<PriArea>的所有子节点进行处理,该私有区域<PriArea>的子节点为需要运算得出结果的单个字段,将运算结果存入中间变量列表中,仅用于中间数据运算,不计入组包结果;

(2.4)若数据包节点<Package>的子节点的节点名为标识区域<FlagArea>,则进入标识区域处理流程:依次对标识区域<FlagArea>的所有子节点进行处理,并将得到的子节点数据写入一个临时列表中,当该标识区域<FlagArea>的所有子节点处理完毕后,将临时列表中的子节点数据按照指定的数据拼接方式依次拼接,得到一个组包字符串,存入组包结果;在一些实例中,若该标识区域<FlagArea>在后续其他地方参与运算,则通过协议模板定义的引用属性将标识区域<FlagArea>的组包结果写入中间变量列表,后续可以引用该中间变量列表中存储的标识区域<FlagArea>的组包结果,从而将该标识区域<FlagArea>的连续多个数据作为一个整体进行引用。

(2.5)若数据包节点<Package>的子节点的节点名为保护区域<ProArea>,则进入保护区域处理流程:该保护区域处理流程与标识区域处理流程类似,但在依次处理完所有子节点得到组包字符串之后,要根据协议模板的保护区域运算定义,对该组包字符串进行运算,将运算结果作为最后的组包结果;即依次对保护区域<ProArea>的所有子节点进行处理,并将得到的子节点数据写入一个临时列表中,当该保护区域<ProArea>的所有子节点处理完毕后,将临时列表中的子节点数据按照指定的数据拼接方式依次拼接,得到一个组包字符串,在依次处理完所有子节点得到组包字符串之后,根据协议模板的保护区域运算定义,对该组包字符串进行运算,将运算结果作为最后的组包结果;

(2.6)若数据包节点<Package>的子节点的节点名为循环区域<CycArea>,则进入循环区域处理流程:该循环区域处理流程包括一个嵌套循环,先根据协议模板定义的循环次数确定外层循环次数,再根据循环区域中子节点的个数确定内层循环次数,在内层循环中依次运算子节点的结果,每个子节点的结果会根据协议模板定义运算出固定结果;当两层循环处理完毕,将所有子节点的固定结果拼接得到循环区域的组包结果。在一些实施例中,当数据包节点<Package>的节点名为循环区域<CycArea>时,根据协议模板定义,加上内外循环次数作为子节点的结果的文件名后缀,以确保数据的唯一性;再根据协议模板定义,动态读取文件名连续的外部文件数据作为组包结果。

(3)当数据包节点<Package>节点下的所有子节点处理完成后,将每个子节点的组包结果按照协议模板定义的组包方式进行拼接,得到该数据包的组包结果。

如图4所示,通过解析协议模板的XML文件中的关键字来模拟协议动态解析的方法包括如下步骤:

(1)根据传入的协议模板名称及数据包名称,从内存中已加载的协议模板数据中通过匹配<Package>标签找到与传入的数据包名称相同的节点;

(2)依次循环遍历数据包节点<Package>的子节点,对协议模板进行预处理;预处理的主要内容是将调用区域的定义替换为被引用区域的内容,以保证相同的协议子模版在协议模板的被引用区域中定义一次后,通过调用区域多次引用;具体包括如下子步骤:

(2.1)若数据包节点<Package>的子节点的节点名为被引用区域<RefArea>,则进入被引用区域处理流程:该被引用区域处理流程将被引用区域整个写入被引用数据中间变量列表中,供调用区域<CallArea>直接引用;

(2.2)若数据包节点<Package>的子节点的节点名为调用区域<CallArea>,则进入调用区域处理流程:该调用区域处理流程将根据该调用区域<CallArea>的节点值获取被引用区域的名称,从调用区域<CallArea>的id属性获取其子节点id的前缀信息,然后将被引用区域的所有子节点的id加上前缀信息进行更新后替换协议模板的调用区域内容,将被引用区域的所有子节点的id加上前缀信息是为避免被引用区域在多处被引用后id不唯一的问题。

(3)协议预处理完成后,再次依次循环解析数据包节点<Package>的子节点,根据不同关键字进行不同的操作步骤,输出子节点的解析结果,并将解析结果记入解析结果列表中;其中,被引用区域以及调用区域的内容不处理,直接跳过。具体步骤如下:

(3.1)若数据包节点<Package>的子节点的节点名为字段<Field>,则进入字段处理流程:根据字段长度及运算出的字段偏移获取字段实际值,或者根据字段分隔符获取字段实际值;若定义了字段预期值,则根据预期值的字段运算方式获取字段预期值(与组包时的数据生成方式定义及处理类似);然后将字段实际值与字段预期值进行比对,若一致则流程继续进行,不一致则输出错误信息并终止解析流程;

(3.2)若数据包节点<Package>的子节点的节点名为准备区域<PreArea>,则进入准备区域处理流程:依次将准备区域<PreArea>的所有子节点定义的数据(主要是文件数据以及少量常量数据)读取到中间变量列表中,以备后续使用;

(3.3)若数据包节点<Package>的子节点的节点名为私有区域<PriArea>,则进入私有区域处理流程:依次对该私有区域<PriArea>的所有子节点进行处理,该私有区域<PriArea>的子节点为需要运算得出结果的单个字段,将运算结果存入中间变量列表中,仅用于中间数据运算,不计入组包结果;

(3.4)若数据包节点<Package>的子节点的节点名为标识区域<FlagArea>,则进入标识区域处理流程:先根据协议模板定义获取该标识区域<FlagArea>的数据,再依次对标识区域<FlagArea>的所有子节点进行处理,并将得到的子节点数据写入一个临时列表中,当该标识区域<FlagArea>的所有子节点处理完毕后,将临时列表中的子节点数据按照顺序输出一个解析字符串到结果文件的XML文件中,便于用户查看;若该标识区域<FlagArea>在后续其他地方参与运算,也可通过协议模板的引用属性定义将输出的解析字符串写入中间变量列表,后续可以直接引用该解析字符串。整个标识区域<FlagArea>的数据,以及该标识区域<FlagArea>中的子节点获取方式一共有两种:

一种是根据该标识区域<FlagArea>的数据长度,以及运算出来的该标识区域<FlagArea>的数据偏移来获取数据,这种类型适用于数据是数值直接拼接的情况;

另一种是根据协议模板定义的分隔符来获取数据,这种类型适用于数据的拼接方式是带有格式的情况。

(3.5)若数据包节点<Package>的子节点的节点名为保护区域<ProArea>,则进入保护区域处理流程:首先,根据保护区域的数据长度获取该保护区域解析前的数据,然后根据保护区域的运算信息子节点<CalcInfo>中定义的运算信息,将保护区域解析前的数据作为运算函数的输入参数,运算后得到解除保护后的数据(此处保护区域解析前的数据可理解为协议对端加密后的密文数据,解除保护后的数据则为本端解密后的明文数据);然后将解除保护后的数据按照保护区域的具体字段定义依次解析,得到该保护区域数据的最终解析结果;

(3.6)若数据包节点<Package>的子节点的节点名为循环区域<CycArea>,则进入循环区域处理流程:先根据协议模板定义的循环次数,实时动态生成本循环的协议模板,例如:循环5次,则将协议模板中循环区域<CycArea>的子节点依次复制到5次,并根据循环次数动态更新其字段ID等保证字段在模板中的唯一性。然后再获取循环区域<CycArea>的数据,并按照实时动态生成的本循环的协议模板,依次解析循环区域<CycArea>的各子节点,并输出解析结果;

(3.7)若数据包节点<Package>的子节点的节点名为子模板区域<SubArea>,则进入子模板区域处理流程:该子模板区域处理流程将根据协议模板定义的子模板名称,实时从内存中已加载的协议模板文件中匹配对应的子模板,然后将匹配到的子模板加入子模板临时列表中,以备后续直接引用;

(3.8)若数据包节点<Package>的子节点的节点名为选择区域<SelArea>,则进入选择区域处理流程:该选择区域处理流程类似于编程语言中的if…else…语句,通过在协议模板中定义选择条件,及该选择条件下需要跳转的子模板名称,实现协议处理流程的分支判断及处理,满足选择条件则直接从子模板临时列表中匹配对应的子模板进行解析;其中选择条件有两种定义方式:

一种是前面已解析完毕的节点(已存入中间变量列表中),则选择条件指定为节点名称;

另一种是还未解析出的节点,则根据该节点的数据长度及相对偏移来获取数据。

(4)数据包节点<Package>下的所有子节点处理完成后,将解析结果列表中的解析结果按照顺序依次输出到结果文件中,以备用户查看。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

16页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种快速修改ELF格式文件的方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!