一種通用的樹形二進位制協議描述方法與處理演算法

2021-07-04 10:34:09 字數 4029 閱讀 3351

概述:

本方法定義了一種資料結構,可用於描述任意的樹形二進位制協議,並配合乙個特定的處理演算法,可實現一種通用的,由該種樹形二進位制協議定義的位元流解析與填充的處理,該資料結構的定義如下:

/* 以下結構用於定義乙個協議節點的描述資訊。 */

struct _proto_bits_info;

typedef struct _proto_unit_des proto_unit_des;

/* 以下結構用於定義某段位元流的具體含義。 */

typedef struct _proto_bits_info proto_bits_info;

處理位元流的演算法:

1)使用 proto_unit_des 定義目標二進位制協議的協議描述樹;

2)定義以下的資料結構用於回溯條件段:

typedef struct cond_proto_bits_info;

3)定義以下的資料結構用於記錄處理過程中的上下文:

typedef struct protocol_parser_ctx;

4)定義以下的函式用於從乙個 proto_bits_info 的例項中建立乙個步驟2)定義的 cond_proto_bits_info 的例項,並壓入步驟3)定義的上下文中的 condbacktrace:

static void condition_backtrace_set(

list_obj * backtrace, const proto_bits_info * protoinfo)

;if ( operator_new(&cond_proto_bits_info_des, &condobj) )

}5)定義以下的函式用於從步驟3)定義的上下文中的 condbacktrace 中查詢條件段的偏移位,並且刪除無用的元素:

static offset_t condition_backtrace_get(

list_obj * backtrace, const proto_unit_des * protodes, bool ref)

;do

}return condoffset;

}condnode = backtrace->_cls->getitem(backtrace->_ctx, condnode);

} while (condnode);

}return 0;

}6)定義以下的函式用於初始化乙個 proto_bits_info 的例項:

static const proto_unit_des * protocol_parser_set_proto_bits_info(

protocol_parser_ctx * ctx,

proto_bits_info *     protoinfo,

proto_unit_des_obj *  protodesobj,

offset_t              itemnum,

bool                  refcond)

else

protoinfo->condoffset = 0;

return protodes;

}7)定義以下的函式用於建立 proto_bits_info 的例項,並壓入步驟3)定義的上下文中的 protoinfostack (若過程中的 proto_bits_info 例項的協議節點是乙個條件協議節點,則會執行步驟4)定義的函式):

static void protocol_parser_push_proto_unit_des(

protocol_parser_ctx * ctx, proto_unit_des_obj * protodesobj, offset_t itemnum)

;proto_bits_info * protoinfo = 0;

const proto_unit_des * protodes = 0;

do protoinfo = (proto_bits_info *) protoobj._ctx;

protodes  = protocol_parser_set_proto_bits_info(

ctx, protoinfo, &desobj, itemnum, ref_condition

);if (protodes->iscondition)

condition_backtrace_set(&ctx->condbacktrace, protoinfo);

ctx->protoinfostack._cls->pushfront(

ctx->protoinfostack._ctx, &protoobj

);} while ( protodes->subdeslist._cls->getitemcount(

protodes->subdeslist._ctx

) );

}8)定義以下的函式用於初始化步驟3)定義的上下文:

static void protocol_parser_reset(protocol_parser_ctx * ctx)

static bool protocol_parser_begin_parse(

ctx_t ctx, uint8_t * buffer, size_t bufsize, proto_unit_des_obj * protodesobj)

return false;

}9)定義以下的函式用於從步驟3)定義的上下文中解析出乙個 proto_bits_info 的例項:

static bool protocol_parser_parse(ctx_t ctx, proto_bits_info * out_protoinfo) ;

proto_unit_des_obj subdesobj = ;

proto_bits_info subprotoinfo = ;

const proto_unit_des * subdes = 0;

protoinfostack->_cls->getitemvalue(protonode, &protoobj);

protoinfo = (proto_bits_info *) protoobj._ctx;

protodes  = protoinfo->protodes;

while (protoinfo->subdesnode)

protoinfo->subdesnode = protodes->subdeslist._cls->getitem(

protodes->subdeslist._ctx, 0);}

protodes->subdeslist._cls->getitemvalue(

protoinfo->subdesnode, &subdesobj

);subdes = protocol_parser_set_proto_bits_info(

parserctx,

&subprotoinfo,

&subdesobj,

protoinfo->subitemnum,

peek_condition

);if ( subdes->length(&subprotoinfo) )

if (subdes->condition)

}protoinfostack->_cls->popfront(

protoinfostack->_ctx, &protoobj

);protoinfo = (proto_bits_info *) protoobj._ctx;

protodes  = protoinfo->protodes;

if (protodes->staticsize)

if (parserctx->dataoffset <= parserctx->datasize * 8)

operator_delete(&protoobj);

protocol_parser_reset(parserctx);}}

return false;

}10)迴圈執行步驟9)定義的函式,直至返回 false 。

如果是解析位元流,則即可獲得乙個 proto_bits_info 的序列;

如果是填充位元流,則每獲得乙個 proto_bits_info 的例項,根據其資訊填充相關的資料到緩衝區中。

一種二進位制資料交換協議的設想

json 是一種相當舒服的資料表示方法,因此常常作為鬆散整合的各服務之間的訊息承載協議。其優點在我看來有 1.語法簡單,容易解析和流化 2.表達能力雖然不十分強悍,但足以應付大多數場景 3.有自描述能力,無需額外的介面定義語言 4.資料中包含了基本的型別資訊,便於程式自動化處理 5.和程式中的常用資...

IOCP 二進位制協議 分包

一 iocp 二進位制協議分包的思路 解析資料頭,獲取協議包體的大小,判斷是否收到乙個完整的資料頭,如果不是,繼續投遞recv請求,直到收到乙個資料頭 異常的資料報,關閉session pkg size max pkg size 全部資料收到,進行處理.1 判斷long pkg是否存在,如果存在,就...

二進位制字元檔案轉二進位制的3種姿勢

今天學弟問了乙個ctf題,是關於二進位制字元檔案轉二進位制檔案的問題。自己用了乙個struct庫解出來了,是這樣的 import struct f open num.txt r fout open res.txt ab data f.read for i in range 0,len data 16...