- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
接口协议智能编解码方法研究
2.1 XML文档结构的设计
利用XML 文档存储编解码规则时,关键是XML 文档结构的设计,因为XML 文档结构在一定程度上会影响编解码的效率甚至是整个仿真软件的效率。我们按照逐级分类原则对编解码规则进行分类存储。比如飞机A 的位置这样一条信息的接口协议存取为XML 文档后,其结构如下所示:
<飞机A>
<位置>
<经度><起始位置>起始位置><长度>长度><数据类型> 数据类型>经度>
<纬度> …纬度>
<高程> …高程>
位置>
飞机A>
省略号代表对应的编解码接口协议。当我们把所有的编解码规则都存储到XML 文档后,我们就可以利用已有的XML 文档进行报文编码与解码。当编解码信息长度或者是编解码信息单元内的信息位置需要改变时我们只需要修改XML 的相应内容。
2.2 编解码方法的数据结构
为了对接口协议进行有效的编解码,其编码的数据结构的设计至关重要。在设计接口协议编解码的数据结构时,既要考虑复杂信息系统接口协议的特点,又要方便程序的开发。
一方面,在报文编解码时我们应该首先对整条报文编解码加以控制,比如应答控制、重发控制、纠错控制、目的地控制、发送通道控制等。我们将这种控制信息叫做报头编解码(帧头编解码),其数据结构可设计如下:
typedef struct FrameHead
{
char* frame_number; //报文编号
bool type; //报文类型(发送还是反馈)
char* start; //发送方
char* destination; //接收方
byte number; //编解码信息单元数量
short length; //编解码信息单元长度
bool responsion; //应答控制
char* resposion_number; //所应答报文的编号
byte chunnel; //发送通道
Unit* info; //第一个编解码信息单元
} FrameHead;
另一方面,每条完整的接口信息都是由若干编解码信息单元组成,编解码信息单元的数据结构的设计直接关系到编解码的效率和可扩展性,其数据结构可设计如下:
typedet struct Unit
{
char* unit_number; //信息单元编号
bool send_element[MAX_ELE]; //有效信息标识
Unit* next; // 下一信息单元
}Unit;
其中,MAX_ELE 为编解码信息单元内最大的信息元素数量(比如,经度即可视为一个信息元素)。当信息元素是本接口信息的最后一个时,next=NULL。
2.3编解码流程
程序设计时,我们主要关心两种流程:数据流和程序流程。前者是我们从整体上把握编解码设计的体系;后者是详细的功能实现。
整个数据流程是这样的:首先,将编解码规则整理、存储为XML 文档,然后,利用XML 文档对协议报文进行编码,最后,再利用XML 文档对协议密文进行解码。
在进行程序编解码时,从帧头入手,先对控制信息进行编解码,然后对每个信息单元编码。对信息单元编码时,以信息元素为最小信息体,依照编解码规则对每个信息元素进行编解码。
编码设计的程序流程如图3 所示。解码即为编码的逆过程。
依据编解码规则的XML 文档和报文编解码的数据结构里的信息我就们就可以对报文进行编码和解码了。编码的实质就是将信息依据编码规则转化成二进制的代码;解码是它的逆过程。编码的实现其实就是对计算机内存的位操作。如果某项信息(信息元素)在编码信息单元内占用了i n 到i+k −1 n 的K 位,那么我们编码的任务就是依据实际信息将这K 位填充。在对位进行操作时,一般的方法是先定位所操作的位所属的字节,然后取出这一字节的信息,再接下来用"|"操作对其进行写操作。比如,要将一个128 位数据中的第100 位置1,我们先取出第100/8 + 1=13个字节的信息,然后再将这个字节的信息"|"上"1000"。这样,循环K 次便可完成这个信息元素的编码。有一种情况就是连续的K 位信息在一个字节内,这时,我们只需要进行一次操作便可完成此信息元素K 位的编码。这种编码方法的优点是辅助编码的空间占用少;速度也比较高,尤其是信息元素编码都在一个字节内时。
在编码时,我们还可以采取另外一种函数实现上更加快捷的方法。这种编码方法的思想是先将编码信息的每一位放在一个字节空间中,然后按由低到高的顺序将每八个字节空间的信息转换到信息编码单元中的一个字节。这样的好处是便于处理跨字节的信息元素编码,思路新颖。
显然,可以根据以上思路设计出两种解码函数,它们分别是上述编码函数的逆过程。经过测试,发现在信息单元长度不超过512 位时,上述两种方法的效率基本一样;在信息单元长度很大时,第二种方法会稍快些。
作者:肖凡 马瑞萍 冀海燕 来源:21IC电子网