C如何序列化结构数组到char数组?

时间:2015-09-29 07:06:53

标签: c arrays serialization struct

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

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

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

序列化为char数组 -

char reply[1024];

通过socket发送并反序列化?

#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;

}

2 个答案:

答案 0 :(得分:0)

你基本上只有两个选择,两者都非常相似:

  1. 循环遍历数组中的所有结构,序列化当前结构,发送给对等体。要知道数组的开头和结尾,请先发送条目数,或者使用特殊的结尾标记。

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

答案 1 :(得分:0)

根据Joachim Pileborg的建议添加选项2。

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

  1. 使用“unsigned char”数组

  2. 而不是“char”数组
  3. 在头文件中使用#pragma pack()作为结构定义,如下所示:

  4. -

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

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