Задать вопрос

Обертка на сырые данные?

Требуется собирать/разбирать бинарные пакеты по формальным описаниям форматов.
Формальные описания хранит класс 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.

И пока что есть следующая проблема: как быть, если некоторые поля данных станут контейнерного типа — будут содержать список значений одного размера по одному тэгу?

Прокомментируйте, пожалуйста, решение.

Спасибо
  • Вопрос задан
  • 2513 просмотров
Подписаться 3 Оценить 2 комментария
Решения вопроса 1
@xandox
Твое решение очень напоминает google protocol buffers, и как следствие, если есть возможность, я бы посоветовал не изобретать велосипед, а взять готовое решение

по поводу твоего вопроса - посмотри как сделано это в protocol buffers
если коротко
есть три вида поля required, optional, repeated (required - нас сейчас не интересует), если во входящем сообщении встречается несколько раз optional или required - то берется последнее из этих значений для поля, если поле repeated - то все значения добавляются в коллекцию.

P.S protocol buffers - бинарный протокол, но умеет и текстовое представление. Не очень понимаю зачем в 21 веке кому-то мог понадобиться xml? У него есть три оригинальных (в смысле от гугла) реализации + куча совместимых для разных языков.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы