針對二進制協議(如 MPEG-TS)解析代碼繁瑣、難維護、擴展性差的問題,提出基於元類編程的通用描述框架。核心思想:用元類描述協議邏輯結構,通用解析引擎驅動具體解析流程。
struct IFieldDescriptor {
virtual unsigned ID() const = 0; // 唯一標識
virtual const char* Name() const = 0; // 除錯用
virtual bool IsCondition() const = 0; // 是否為條件字段
virtual const IFieldDescriptor* ConditionFieldDescriptor() const = 0; // 依賴的條件字段
virtual const IProtocolDescriptor* CastToProtocolDescriptor() const = 0; // 是否為子協議
virtual size_t FieldSize(stream_iterator it) const = 0; // 字段大小(bit)
virtual size_t FieldCount(stream_iterator cond, stream_iterator data) const = 0; // 字段個數(運行時)
};
struct IProtocolDescriptor {
virtual size_t GetFieldDescriptorCount() const = 0;
virtual const IFieldDescriptor* GetFirstFieldDescriptor() const = 0;
virtual const IFieldDescriptor* GetNextFieldDescriptor() const = 0;
};
定義 image_header (width, height) 與 image_data (大小由 header 決定)。CImageHeaderDes 同時實現 IFieldDescriptor 與 IProtocolDescriptor,作為子協議容器。CImageDataDes 通過 ConditionFieldDescriptor 關聯 header,FieldCount 根據 width×height 動態計算。
後續將介紹如何利用描述資訊驅動位流解析並輸出字段序列。