从struct创建二进制块

时间:2010-06-16 12:49:08

标签: c++ stl binary std

我希望标题描述问题,如果有人有更好的想法,我会改变它。

我将信息存储在这样的结构中:

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 == byte)

我现在的问题是如何从我得到的不同数据类型中形成这样的数据包。我已经阅读了很多页面并找到了像std :: bitset或boost :: dynamic_bitset这样的数据类型,但似乎都没有解决我的问题。

我认为很容易看出,上面的代码只是一个例子,原始标准要复杂得多,并且包含更多不同的数据类型。解决上面的例子也应该解决我对复杂结构的问题。

最后一点: 这个问题应该通过使用标准的,可移植的C ++语言特性(如STL或Boost)来解决(

3 个答案:

答案 0 :(得分:1)

我认为您需要的所有内容都在此常见问题解答中描述: http://www.parashift.com/c++-faq-lite/serialization.html

答案 1 :(得分:0)

基本上,您将分配一个无符号char(BYTE)数组,其长度为类中所有变量的总大小(使用sizeof())。然后,您将使用memcpy将正确偏移量复制每个变量的内容。

请注意,这只是一种基本方法,我绝对建议在zerm的答案中查看c ++ faq链接。

答案 2 :(得分:0)

我现在使用std::bitset为数据类型生成位序列,然后将这些位集连接到一个大位集。 这样就可以保存我需要的数据。我只需检查一下/大端。