【问题标题】:C how to serialize array of structs to char array?C如何将结构数组序列化为char数组?
【发布时间】:2015-09-29 07:06:53
【问题描述】:

此代码将结构序列化为 char 数组,我可以通过套接字将其发送并反序列化。

如何修改此代码以使用结构数组

server_message[n].response =  strdup("RESPONSE");
server_message[n].command = strdup("COMMAND");
server_message[n].data = strdup("DATA");

序列化为 char 数组 -

char reply[1024];

通过套接字发送并反序列化?

#include <string.h>


typedef struct __attribute__((__packed__)) arch_sm
{
    char* response;
    char* command;
    char* data;
} request_struct_sm;
size_t serialize(const request_struct_sm* arch_sm, char* buf)
{
    size_t bytes = 0;
    memcpy(buf + bytes, arch_sm->response, strlen(arch_sm->response) + 1);
    bytes += strlen(arch_sm->response) + 1;
    memcpy(buf + bytes, arch_sm->command, strlen(arch_sm->command) + 1);
    bytes += strlen(arch_sm->command) + 1;
    memcpy(buf + bytes, arch_sm->data, strlen(arch_sm->data) + 1);
    bytes += strlen(arch_sm->data) + 1;
    return bytes;
}

void deserialize_server(const char* buf, request_struct_sm* arch_sm)
{
    size_t offset = 0;
    arch_sm->response = strdup(buf + offset);
    offset += strlen(buf + offset) + 1;
    arch_sm->command = strdup(buf + offset);
    offset += strlen(buf + offset) + 1;
    arch_sm->data = strdup(buf + offset);
}

int main(){
    request_struct_sm server_message;
    request_struct_sm client_message;
    server_message.response =  strdup("RESPONSE");
    server_message.command = strdup("COMMAND");
    server_message.data = strdup("DATA");

  // server_message[0].response =  strdup("RESPONSE"); //Need to be able use array of structure
  //  server_message[0].command = strdup("COMMAND");
  //  server_message[0].data = strdup("DATA");

    char reply[1024] = {0};
    size_t bufLen = serialize(&server_message, reply);
    deserialize_server(reply, &client_message);
    printf("client_message.response = %s\n"
            "client_message.command = %s\n"
            "client_message.data = %s\n",
            client_message.response, client_message.command, client_message.data);
    return 0;

}

【问题讨论】:

    标签: c arrays serialization struct


    【解决方案1】:

    你基本上只有两个选择,而且都很相似:

    1. 遍历数组中的所有结构,序列化当前结构,发送给对等体。要知道数组的开始和结束,要么先发送条目数,要么有一个特殊的结构结束标记。

    2. 开始时与前一种方式相同,但不是逐个发送每个(序列化)结构,而是将每个(序列化)结构附加到一个非常大的数组中,大到足以容纳所有结构。然后发送整个数组。同样,您需要某种方式来发送长度或数据结束标记。

    【讨论】:

    • 感谢您的回复!我也想过,我用过stackoverflow.com/a/8941319/1564325这个解决方案,但是我用的是char a[]回复。我有一个问题,回复只包含第一行“RESPONSE”。如何指定全长?
    【解决方案2】:

    按照 Joachim Pileborg 的建议添加到选项 2。

    以下更改可能有助于将结构序列化为数组:

    1. 使用“unsigned char”数组代替“char”数组

    2. 在头文件中使用#pragma pack() 来定义结构体,如下所示:

    -

    #pragma pack(push, 1)
    struct Example       
    {           
        char ch;           
        int val;           
        short opt;           
        ...       
    };   
    #pragma pack(pop)
    

    这将消除将结构长度值作为序列化数据的一部分发送给对等方的要求。 发送者和接收者都将拥有头文件和相同的结构长度(使用 sizeof())。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多