Создание двоичного блока из структуры - PullRequest
1 голос
/ 16 июня 2010

Я надеюсь, что заголовок описывает проблему, я изменю ее, если у кого-то есть идея получше.

Я храню информацию в такой структуре:

struct AnyStruct
{
    AnyStruct() :
        testInt(20),
        testDouble(100.01),
        testBool1(true),
        testBool2(false),
        testBool3(true),
        testChar('x') {}

    int testInt;
    double testDouble;
    bool testBool1;
    bool testBool2;
    bool testBool3;
    char testChar;

    std::vector<char> getBinaryBlock()
    {
        //how to build that?
    }
}

Структура должна быть отправлена ​​через сеть в двоичном байтовом буфере со следующей структурой:

Bit 00- 31: testInt
Bit 32- 61: testDouble most significant portion
Bit 62- 93: testDouble least significant portion
Bit     94: testBool1
Bit     95: testBool2
Bit     96: testBool3
Bit 97-104: testChar

В соответствии с этим определением результирующий std :: vector должен иметь размер 13 байт (char == байт)

Теперь у меня вопрос, как я могу сформировать такой пакет из разных типов данных, которые у меня есть. Я уже прочитал много страниц и нашел типы данных, такие как std :: bitset или boost :: dynamic_bitset, но ни один из них не решил мою проблему.

Я думаю, что легко заметить, что приведенный выше код является лишь примером, исходный стандарт намного сложнее и содержит больше разных типов данных. Решение вышеприведенного примера также должно решить мои проблемы со сложными структурами.

Последний пункт: Проблема должна быть решена с помощью стандартных переносимых функций языка C ++, таких как STL или Boost (

Ответы [ 3 ]

1 голос
/ 16 июня 2010

Я думаю, что все, что вам нужно, описано в этом FAQ: http://www.parashift.com/c++-faq-lite/serialization.html

0 голосов
/ 13 октября 2010

Я теперь использовал std::bitset для генерации битовых последовательностей для типов данных, а затем объединил эти битовые наборы в один большой битовый набор.Затем он содержит данные, которые мне нужны.Я просто должен проверить на маленький / большой порядок байтов.

0 голосов
/ 16 июня 2010

По сути, вы должны выделить массив без знака char (BYTE) длины общего размера всех переменных в вашем классе (используйте sizeof()). Затем вы должны скопировать содержимое каждой переменной с правильным смещением, используя memcpy.

Обратите внимание, что это всего лишь базовый подход, и я бы определенно предложил взглянуть на ссылку c ++ faq в ответе zerm.

...