LINUX.ORG.RU

Обертка на буфер данных

 


0

1

Здравствуйте, прокомментируйте, пожалуйста, решение и вопрос в самом конце.

Сырые данные из u_int8 *buffer оборачиваются классом Wrapper, который делит buffer на поля, каждому полю ставит в соответствие tag и размер поля. Структура данных для обертки задается списком объектов класса 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.

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


у вас снаружи прилетает исключительно asciiz-строка, судя по единственному конструктору ?

и при чём тут тогда метод setStructure(), если данные уже тут, внутри экземпляра, вместе с их структурой..

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

ИМХО у него снаружи прилетает указатель на некую структуру (в его же коде определённую) приведённый к char*. Пока он ещё не осознал тот факт, что ABI C++ не стандартизирован.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Сделай статическую рефлексию на boost::fusion и шаблонах

Сразу отметается, ибо Boost еще не изобрели.

и при чём тут тогда метод setStructure(), если данные уже тут, внутри экземпляра, вместе с их структурой..

Wrapper только надевает «структуру» на буфер с данными (в данном конкретном случае, буфер — это c_string), но не хранит его.

Пока он ещё не осознал тот факт, что ABI C++ не стандартизирован.

Можно чуть более развернуто, где это решение пересекает отсутствие стандарта для ABI?

h0x0d9
() автор топика
Ответ на: комментарий от h0x0d9

Сразу отметается, ибо Boost еще не изобрели.

Сделай без буста, с кортежами и итерацией по кортежам. Полный Boost.Fusion тут не нужен, можно обойтись своим велосипедом.

Wrapper только надевает «структуру» на буфер с данными (в данном конкретном случае, буфер — это c_string), но не хранит его.

Откуда ты берёшь буфер с данными и как ещё с этим буфером работаешь?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Откуда ты берёшь буфер с данными и как ещё с этим буфером работаешь?

Пишу из сокета или двоичного файла.

h0x0d9
() автор топика

вы хотите собирать/разбирать бинарные пакеты по формальным описаниям форматов? так что-ли..

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

вы хотите собирать/разбирать бинарные пакеты по формальным описаниям форматов?

Да. И Wrapper — класс, хранящий метаданные для данных на входе.

h0x0d9
() автор топика
Ответ на: use ASN.1, luke от anonymous

Asn завязан с ber/der, оно тут может буть разве что входом, типа xml.

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.