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

标签 c arrays serialization struct

这段代码将结构序列化为字符数组,我可以通过套接字发送它并反序列化回来。

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

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

序列化为字符数组 -

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;

}

最佳答案

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

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

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

关于C如何将结构数组序列化为char数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32837736/

相关文章:

计算每个子目录的文件 - C (POSIX) 中的程序

ruby - 相当于 ActiveRecord 的 `serialize` 方法的 Mongoid

c - 以 IEEE 754 交换格式记录/读取 C double

java - Gson 错误?反序列化器的存在会损害 Gson 中的序列化过程

在 PortAudio 中连续录音(来自麦克风或输出)

c - C语言如何退出控制台屏幕

c++ - 非 IEEE 754 浮点类型的大小如何受到限制?

c++ - 新的整数数组向右移动?

javascript - 来自唯一值数组的唯一随机值 javascript

c++ - 这是什么 : int (*z())[5];