我正在尝试将以下结构序列化为字符串,然后使用UDP sendto方法通过网络流发送它。随后在接收端我想反序列化字符串并重新构造结构。
这是结构定义。
typedef struct PATH{
int server1;
int server2;
int weight;
}PATH;
这是序列化方法
char* serialize(PATH** arr, int sz){
char* buffer = (50, sizeof(int));
for (int i = 0; i < sz ; ++i)
{
&buffer+= arr[i]->server1:
&buffer+= arr[i]->server2;
&buffer+= arr[i]->weight;
}
buffer+='\n';
return buffer;
}
我最终得到的错误是
src/message.c:5:11: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'unsigned long' [-Wint-conversion]
char* buffer = (50, sizeof(int));
^ ~~~~~~~~~~~~~~~~~
src/message.c:9:13: error: expression is not assignable
&buffer+= arr[i]->server1:
~~~~~~~^
src/message.c:11:13: error: expression is not assignable
&buffer+= arr[i]->weight;
~~~~~~~^
我做错了什么?任何帮助表示赞赏。
答案 0 :(得分:1)
您没有使用正确的语法动态分配内存;看起来你打算打电话给calloc
,但遗漏了这个功能。
您不能使用+=
分配地址并增加变量,您需要使用间接。您还需要保存原始buffer
地址,并增加一个不同的变量,这样您就可以在结束时返回缓冲区的开头。并且在迭代期间使用的指针需要为int*
,这样它将以int
的大小逐步通过缓冲区,而不是单个字符。
char* serialize(PATH** arr, int sz){
char* buffer = calloc(50, sizeof(int));
int *p = (int*)buffer;
for (int i = 0; i < sz ; ++i)
{
*(p++) = arr[i]->server1:
*(p++) = arr[i]->server2;
*(p++) = arr[i]->weight;
}
*(p++) = '\n';
return buffer;
}
请注意,这只是发送整数的二进制表示,而不是将它们转换为字符串。在二进制协议中使用换行符分隔符似乎很奇怪 - 首先发送sz
可能会更好,然后接收者可以简单地使用for
循环来读取多次重复。< / p>
要处理字节序问题,您可能应该在发送数据时调用htonl()
,并在接收时调用ntohl()
。例如。序列化应该做:
$(p++) = htonl(arr[i]->server1);
等等。