Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Упаковка пользовательского типа в пакет байт, (использование потоков ввода вывода) 
:(
    Опции темы
np9mi7
  Дата 23.1.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Добрый день!

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

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) можно организовать, используя потоки ввода/вывода;

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

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

Это сообщение отредактировал(а) np9mi7 - 23.1.2006, 23:21


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
chipset
Дата 23.1.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Boost.Serialization


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
chipset
Дата 24.1.2006, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Если не нравиться Boost, попробуй другие сериализационные либы, такие как к примеру описываються здесь.
Свой велосипед можно построить кстати и на основе Boost, насколько я знаю, там дефайны вовсю пользуються ;)


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
DeadSoul
Дата 24.1.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



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

Boost.Serialization

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

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



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
bel_nikita
Дата 24.1.2006, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



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));        
    }
    
};



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2005 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.