Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Упаковка пользовательского типа в пакет байт


Автор: np9mi7 23.1.2006, 14:00
Добрый день!

Задача: Имеется объект
Код

struct __some
{
    BYTE        byValue1;
    BYTE        byValue2;
    DWORD        dwValue3;
    DWORD        dwValue4;
    WORD        wValue5;
};

Необходимо упаковать этот объект в пакет (играться со смещениями, и жесткими приведениями структуры не хочеться). В итоге сделал так:
Код

struct __some
{
    BYTE        byValue1;
    BYTE        byValue2;
    DWORD        dwValue3;
    DWORD        dwValue4;
    WORD        wValue5;
    
    static void serialize (const __some & utSome, BYTE * const pBuffer)
    {
        BYTE * pCurrent (pBuffer);
        
        * (pCurrent)    = utSome.byValue1;
        pCurrent += sizeof (BYTE);
        
        * (pCurrent)    = utSome.byValue2;
        pCurrent += sizeof (BYTE);
        
        * reinterpret_cast <DWORD * > (pCurrent)
                        = utSome.dwValue3;
        pCurrent += sizeof (DWORD);
        
        * reinterpret_cast <DWORD * > (pCurrent)
                        = utSome.dwValue4;
        pCurrent += sizeof (DWORD);
        
        * reinterpret_cast <WORD * > (pCurrent)
                        = utSome.dwValue5;
        pCurrent += sizeof (WORD);
    }
    
};

Довольно уродливо выглядит. Я подозреваю, что то что я затеял внутри void __some::serialize (const __some &, BYTE * const) можно организовать, используя потоки ввода/вывода;

Вопрос: Может кто решал подобные проблемы, используя потоки ввода/вывода, и поделиться своим опытом в этой области?

Заранее благодарен за ответы.

Автор: chipset 23.1.2006, 23:35
Boost.Serialization

Автор: chipset 24.1.2006, 17:03
Если не нравиться Boost, попробуй другие сериализационные либы, такие как к примеру описываються http://greggman.com/edit/moblogposts/2005-06-27moblog.htm.
Свой велосипед можно построить кстати и на основе Boost, насколько я знаю, там дефайны вовсю пользуються ;)

Автор: DeadSoul 24.1.2006, 22:05
Цитата(chipset @ 23.1.2006, 23:35 Найти цитируемый пост)

Boost.Serialization

Из пушки по воробьям. Я бы поставил выравнивание и
Код

void serialiaze(fstream& str,some& q )
{
  str.write( &q, sizeof(q) );
}

Автор: bel_nikita 24.1.2006, 22:18
np9mi7
Ну, в твоем случае можно оператор перегрузить, вроде этого:
Код

// m_pBuffer - буфер
// m_CurrentPosition - текущая позиция в буфере
    template<class T> __some& operator << (T tData)
    {
        *((T*)(m_pBuffer + m_CurrentPosition)) = tData;
        m_CurrentPosition += sizeof(T);
        return *this;
    }

или на худой конец:
Код

struct __some
{
    BYTE        byValue1;
    BYTE        byValue2;
    DWORD        dwValue3;
    DWORD        dwValue4;
    WORD        wValue5;
    
    static void serialize (const __some & utSome, BYTE * const pBuffer)    {
        BYTE * pCurrent (pBuffer);
    memcpy(pBuffer,this,sizeof(__some));        
    }
    
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)