如何将可变大小的结构转换为char数组

时间:2018-08-28 23:32:03

标签: c++ serialization

我正在尝试序列化作为UDP消息发送的结构。我遇到的问题是该结构包含一个可变长度的子结构数组,如下所示:

struct SubStruct
{
    short val1;
    short val2;
};

struct Message
{
    short numSubStructs;
    SubStruct* structs;
};

我用于发送固定长度消息的方法是将结构转换为unsigned char*。低于MSG_LENGTH等于sizeof(short) + numSubStructs * sizeof(SubStruct)

send(socket, reinterpret_cast<unsigned char*>(&someMessage), MSG_LENGTH);

这对我所有的固定长度消息都很好,但对可变长度消息却不行。查看通过套接字发送的数据,我很确定它正在发送structs指针的实际地址。

我的问题是,除了循环遍历指针(数组)并附加到某个缓冲区之外,是否有一种方法可以序列化这种结构?

谢谢

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

char *serializedMessage = new char[sizeof(short) + someMessage.numSubStructs * sizeof(SubStruct)];
// Error check here

// Insert the count of structs
memcpy(serializedMessage, &someMessage.numSubStructs, sizeof(short));
// Copy the structs themselves.
memcpy(&serializedMessage[sizeof(short)], someMessage.structs,
        someMessage.numSubStructs * sizeof(SubStruct));

// Transmit serializedMessage

delete[] serializedMessage;

注意。这并不关注数据的字节性,因此,如果源计算机和目标计算机具有不同的字节性,则很有可能失败。

答案 1 :(得分:0)

我不知道用C ++做到这一点的优雅方法。但是有一些丑陋的方法。基本上,分配一个足以容纳整个“展开”结构和子结构的缓冲区。如果结构的最后一个成员是可变大小的元素,则维护起来还不错。如果有多个嵌套结构,那么它将变得笨拙。

这是C风格的示例。

struct example{
   int array_length;
   some_struct array[1];  // beware of padding in structure between the fields
}

int number_of_structs = 2;
example* ptr = malloc(sizeof(int)+ number_of_structs*sizeof(some_struct));
ptr->array_lenth = number_of_structs;
ptr->array[0].first_field = 1;
ptr->array[1].first_field = 2;

send(socket, ptr, sizeof(int)+ number_of_structs*sizeof(some_struct));

还有一些(非标准)使用zero length arrays的方法。