设计与实现。
3.3 CAP软件模块研究与实现
3.3.1 CAP协议解码分析
在对CAP进行解码分析前,首先要知道BER编码的基本编码格式。BER以8 b为一个基本传送单位。对于每个所传送的值,无论是基本类型还是构造类型,都由TLV三个字段组成。TLV分别指标识类型标识符域(TAG)、数据长度域(LENGTH)和数据域(VALUE)字段。其中,数据域可以多重嵌套其他数据元素的TLV字段。BER编码的具体格式如图3所示。
在CAP协议描述中,以localValue,length,operator-code,errorcode分别对应BER编码中的TLV,组成树状数据结构图[1],具体解码设计将在下面分析。
3.3.2 解码器实现方案
在通信测试仪表中主要是对协议及信令的PDU进行操作,为满足对PDU的公共操作我们制定了CPdu基类,主要实现对PDU的创建、删除、合并、内存管理、长度检查、指针操作等基本功能。在继承CPdu类的基础上,我们派生出CPduCap类,在类CPduCap中设定外部接口函数int Deeode(CString&res),完成详细解码过程,并通过引用传递的方式将解码结果置于CString类型的字符串内,便于主控方调用解码结果。返回值结果定义如下:1:非本层PDU,不操作res;0:成功解码;1:本层PDU,解码出错,错误信息加到结果字符串中。
由于ASN.1语法的特点,Decode(CString&res)函数采用树状遍历嵌套调用的方式进行解码,直至解到BER的基础函数为止。
在基础解码函数中,我们大量使用C++标准模板库中的模板类:容器std::vector。vector是一个多功能的,能够操作多种数据结构和算法的模板类和函数库,在ASN.1复杂数据机构的环境下,vector的使用方便了对各种数据类型进行读取、存储、转换操作。