2015-09-29 102 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())作爲結構。