2015-09-29 48 views
0

这段代码将struct序列化为char数组,并且我可以通过套接字发送它并反序列化。C如何将结构数组序列化为char数组?

如何修改此代码使用结构的阵列

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; 

} 

回答

0

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

  1. 遍历数组中的所有结构,序列化目前的结构,发送给同行。要知道数组的开始和结束,可以先发送条目数,或者有特殊的结构标记。

  2. 从前面的方式开始,但不是逐个发送每个(序列化)结构,而是将每个(序列化)结构追加到一个非常大的数组中,足够大以适应所有结构。然后发送这整个数组。再次,您需要某种方式来发送长度或数据结束标记。

+0

感谢您的回复!我也认为,我已经使用这个解决方案http://stackoverflow.com/a/8941319/1564325,但改为char a []我用回复。我有一个问题,答复只包含第一行“RESPONSE”。如何指定全长? –

0

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

下述变化可在串行结构(S)到数组帮助:

  1. 而是 “字符” 阵列,都使用 “无符号的字符” 阵列

  2. 使用#pragma pack()为您在头文件中的结构定义如下:

-

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

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