【问题标题】:Creating Binary Block from struct从结构创建二进制块
【发布时间】:2026-02-06 11:30:01
【问题描述】:

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

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

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)来解决(

【问题讨论】:

    标签: c++ stl binary std


    【解决方案1】:

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

    【讨论】:

    • 据我所知,这是关于一般的序列化。我确实了解如何序列化数据类型。问题是将给定的数据类型转换为二进制格式并将它们添加到二进制容器中的正确位置。然后下一个问题是我如何从中生成一个 std::string 或一个 std::vector
    【解决方案2】:

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

    请注意,这只是一种基本方法,我强烈建议您查看 zerm 答案中的 c++ 常见问题解答链接。

    【讨论】:

    • 这并不能解决问题,因为 memcpy 只能复制整个字节。例如。不可能将 8 个 bool 的值复制到正确位置的 char 中。还是我理解错了?
    • 您没有,但是您假设 bool 的大小只是一位是错误的。试试sizeof(bool),你会看到它是1,也就是1个字节。
    • 是的,但是可以将 bool 存储到一个位中,这种方式在我必须使用的标准中指定。 (如上例所示,3 个布尔值应存储在 94-96 位中)据我了解,我无法通过使用 memcpy 来实现这一点。
    • 通过一些位移位和位逻辑运算,也许是可能的。
    【解决方案3】:

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

    【讨论】: