一种通用的树形二进制协议描述方法与处理算法

概述:
本方法定义了一种数据结构,可用于描述任意的树形二进制协议,并配合一个特定的处理算法,可实现一种通用的,由该种树形二进制协议定义的比特流解析与填充的处理,该数据结构的定义如下:

/* 以下结构用于定义一个协议节点的描述信息。 */
struct _proto_bits_info;
typedef struct _proto_unit_des {
    const char *                  name; /* 用于描述一个协议节点的名称。 */
    size_t                        staticSize; /* 用于描述一个协议节点的大小,单位是比特,对于可变长编码(如UTF8)的协议节点,或长度不固定的复合型(即由子协议组成的)协议节点,该值为0。 */
    uint32_t                      isCondition; /* 用于描述该协议节点是否为另一个或多个协议节点的条件节点(如定义长度或标记位的协议节点),如果是,则该值为相关协议节点的个数,因此该值的类型为整型而非布尔型。 */
    const struct _proto_unit_des *condition; /* 用于描述该协议节点是否与一个条件节点相关,如果是,则该指针指向其条件节点的描述。 */
    list_obj                      subDesList; /* 用于记录该协议节点的所有下级子协议节点,该值的类型可以是任意集合类型,本实现采用的是list。 */

    size_t (*SizeInBit) (const struct _proto_bits_info * protoInfo); /* 一个可适配的,计算该协议节点大小的函数,单位为比特, 用于计算可变长编码或长度不固定的复合型(即该协议节点的 staticSize 为 0 的)协议节点的大小,当该协议节点的 staticSize 不为 0 时则返回 staticSize 的值。 */
    size_t (*Length)    (const struct _proto_bits_info * protoInfo); /* 一个可适配的,计算该协议节点长度(即个数)的函数,当该函数返回值为 0 时,即表示该协议节点不存在(此时,该协议节点必然与一个条件节点相关,且它的条件节点的值不满足该协议节点的存在条件)。 */
    size_t (*TotalSize) (const struct _proto_bits_info * protoInfo); /* 一个可适配的,计算该协议节点总大小的函数,单位为比特,若该协议节点的 staticSize 不为 0,则简单返回该协议节点的 staticSize 乘以该协议节点的 Length 函数的返回值,否则,逐个的累加该协议节点的 SizeInBit 函数的返回值,累加的次数由该协议节点的 Length 函数的返回值指定。 */
} proto_unit_des;

/* 以下结构用于定义某段比特流的具体含义。 */
typedef struct _proto_bits_info {
    const proto_unit_des * protoDes; /* 该段比特流对应的协议描述。 */

    uint8_t * buffer; /* 该段比特流对应的缓冲区起始地址。 */
    offset_t  itemNum; /* 该段比特流对应的协议描述的下标(即,当对应 protoDes 的 Length 函数返回值大于0时,该值指示了这段比特流的编号),从 0 开始。 */
    offset_t  dataOffset; /* 该段比特流的数据偏移位,单位为比特。 */
    offset_t  condOffset; /* 该段比特流的条件段(即,当对应 protoDes 的 condition 不为 0 时,该 condition 对应的比特段)的偏移位,单位为比特。 */
    void *    subDesNode; /* 用于协议描述树的编历,禁止直接访问。 */
    offset_t  subItemNum; /* 用于协议描述树的编历,禁止直接访问。 */
} proto_bits_info;

处理比特流的算法:
1)使用 proto_unit_des 定义目标二进制协议的协议描述树;
2)定义以下的数据结构用于回溯条件段:
typedef struct {
    const proto_unit_des *protoDes; /* 该条件段对应的协议描述,该协议描述的 isCondition 的值必然大于 0。*/
    offset_t              data

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值