virtual unsigned ID() const { return image_des_header; }
virtual const char * Name() const { return "image_des_header"; }
virtual bool IsCondition() const { return true; }
virtual const IFieldDescriptor * ConditionFieldDescriptor() const { return NULL; }
virtual const IProtocolDescriptor * CastToProtocolDescriptor() const { return this; }
virtual size_t FieldSize(stream_iterator fieldData) const { return 0; } // 我们可以不关心子协议类型的field的大小,至于具体原因,我们将来会再解释
virtual size_t FieldCount(stream_iterator conditionFieldData, stream_iterator fieldData) const { return 1; }
virtual size_t GetFieldDescriptorCount() const { return 2; }
virtual const IFieldDescriptor * GetFirstFieldDescriptor() const {
const_cast
return mSubFieldDes[0];
}
virtual const IFieldDescriptor * GetNextFieldDescriptor() const {
++ const_cast
return mSubFieldDes[mSubFieldDesIdx];
}
CImageHeaderWidthDes mWidthDes;
CImageHeaderHeightDes mHeigthDes;
const IFieldDescriptor * mSubFieldDes[2];
int mSubFieldDesIdx;
public:
CImageHeaderDes() {
mSubFieldDes[0] = &mWidthDes;
mSubFieldDes[1] = &mHeigthDes;
mSubFieldDesIdx = 0;
}
};
class CImageDataDes: public IFieldDescriptor {
virtual unsigned ID() const { return image_des_data; }
virtual const char * Name() const { return "image_des_data"; }
virtual bool IsCondition() const { return false; }
virtual const IFieldDescriptor * ConditionFieldDescriptor() const { return mImageHeaderDes; }
virtual const IProtocolDescriptor * CastToProtocolDescriptor() const { return NULL; }
virtual size_t FieldSize(stream_iterator fieldData) const { return 8; }
virtual size_t FieldCount(stream_iterator conditionFieldData, stream_iterator fieldData) const {
short size[2] = {0};
conditionFieldData.CopyBits( 32, &size, sizeof(size) ); // 这个操作从conditionFieldData中拷贝32bits到size中。
return (int) size[0] * (int) size[1] * 4;
}
const IFieldDescriptor * mImageHeaderDes;
public:
CImageDataDes(const IFieldDescriptor * imageHeaderDes) {
mImageHeaderDes = imageHeaderDes;
}
};
class CImageDes: public IFieldDescriptor, public IProtocolDescriptor {
... // 省略接口IFieldDescriptor和IProtocolDescriptor的实现,请仿造CImageHeaderDes自行补充完整
CImageHeaderDes mImageHeaderDes;
CImageDataDes mImageDataDes;
const IFieldDescriptor * mSubFieldDes[2];
int mSubFieldDesIdx;
public:
CImageDes(): mImageDataDes(&mImageHeaderDes) {
mSubFieldDes[0] = &mImageHeaderDes;
mSubFieldDes[1] = &mImageDataDes;
mSubFieldDesIdx = 0;
}
};
从上面的例子中,我们可以清晰的看到元类IFieldDescriptor和IProtocolDescriptor的描述能力,同时这种表达方式也非常的便于我们(根据原始的结构)检查每一个描述是否是正确的,同时我们也应当看到,这种描述能力是非常灵活的,可以任意的根据我们的需要进行扩展(比如我们最初提出这个设计是为了描述TS协议,但是居然也可以描述位图!而且我们可以肯定,只要是能用树形表示的绝大多数逻辑结构,它都能描述!),之后需要考虑的就是如何利用IFieldDescriptor和IProtocolDescriptor描述出的数据结构,去分析bit流,并且输出一个field的序列。