【问题标题】:How to convert a variable size struct to char array如何将可变大小的结构转换为字符数组
【发布时间】:2018-08-28 23:32:02
【问题描述】:

我正在尝试序列化一个结构以作为 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);

这适用于我所有的固定长度消息,但不适用于可变长度消息。查看通过套接字发送的数据,我很确定它发送的是结构指针的实际地址。

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

谢谢

【问题讨论】:

  • C++ 中不能有可变大小的类型。
  • @NeilButterworth 是的,我明白这一点。我想我应该澄清一下,当我说可变大小时,我的意思是指针指向某个运行时分配的数组。

标签: c++ serialization


【解决方案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;

注意这并不关注数据的字节序,所以如果源机器和目标机器的字节序不同,它很可能会失败。

【讨论】:

  • 谢谢你会试一试的。我知道字节顺序,只是为了简单起见将其排除在外。
【解决方案2】:

我不知道在 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 执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2018-04-28
    • 2014-10-05
    • 1970-01-01
    相关资源
    最近更新 更多