概述:
本方法定義了一種資料結構,可用於描述任意的樹形二進位制協議,並配合乙個特定的處理演算法,可實現一種通用的,由該種樹形二進位制協議定義的位元流解析與填充的處理,該資料結構的定義如下:
/* 以下結構用於定義乙個協議節點的描述資訊。 */
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...