Требуется собирать/разбирать бинарные пакеты по формальным описаниям форматов.
Формальные описания хранит класс Wrapper.
Сырые данные из u_int8 *buffer оборачиваются классом Wrapper, который делит buffer на поля, каждому полю ставит в соответствие tag и размер поля. Структура данных для Wrapper задается списком объектов класса FieldDescription, которые содержат сведения о полях (tag, size), а порядок в списке определяет порядок в Wrapper.
class Wrapper
{
Wrapper(char *);
void setStructure(vector<const FieldDescription *> description);
vector<string> getTagOrder() const;
void *getValue(string tag) const;
size_t getSize(string tag) const;
void setValue(string tag, void * dataPtr);
map<string, void *> getFieldTagToValue() const;
map<string, size_t> getFieldTagToSizes() const;
};
Для полноты картины приведу пример класса-пользователя. Для интерпретации полей Wrapper существует класс Interpreter, который в зависимости от значения интерпретируемого поля и других полей-условий ставит в соответствие строку текста.
class Interpreter
{
public:
// интерпретация данных
enum InterpretationType
{
PARAMLIST,
NUMBER,
STRING,
IPv4,
IPv6
};
void add(Tag_t tag, InterpretationType type);
void add(Tag_t tag, map<ParamValue, ParamName_t> parmCode2Name);
void add_if(Tag_t tag, map<ParamValue_t, ParamName_t> parmValue2Name,
Tag_t conditionTag, ParamValue_t conditionValue);
void add_if(Tag_t tag, map<ParamValue, ParamName_t> parmValue2Name,
multiMap<Tag_t, ParamValue_t> conditionTags2Values);
void add_if(Tag_t tag, InterpretationType type, multiMap<Tag_t, ParamValue_t> conditionTags2Values);
map<Tag_t, string> convert(const Wrapper &prim) const;
};
В будущем хотелось бы записывать в buffer данные из xml и читать из буфера в тот же xml.
И пока что есть следующая проблема: как быть, если некоторые поля данных станут контейнерного типа — будут содержать список значений одного размера по одному тэгу?
Прокомментируйте, пожалуйста, решение.
Спасибо