ANSI C中的序列化和反序列化问题
这是一个我已经做了很长时间的东西,无法解决为什么它不能正常工作,希望你能帮我解决一些问题!。我会尽可能地描述ANSI C中的序列化和反序列化问题,c,networking,serialization,ipc,deserialization,C,Networking,Serialization,Ipc,Deserialization,这是一个我已经做了很长时间的东西,无法解决为什么它不能正常工作,希望你能帮我解决一些问题!。我会尽可能地描述 char* serialize_read(t_pct_read* packet) { char* buffer = malloc( sizeof(t_header) + sizeof(packet->payload.offset) + sizeof(packet->payload.size)
char* serialize_read(t_pct_read* packet) {
char* buffer = malloc(
sizeof(t_header) + sizeof(packet->payload.offset)
+ sizeof(packet->payload.size)
+ strlen(packet->payload.path + 1));
char* payload = malloc(
sizeof(packet->payload.offset) + sizeof(packet->payload.size)
+ strlen(packet->payload.path) + 1);
int offset;
// First I serialize the Payload, in order to calculate It's lenght
memcpy(payload, packet->payload.path, strlen(packet->payload.path) + 1);
offset = strlen(packet->payload.path)+1;
memcpy(payload + offset, &packet->payload.size, sizeof(long unsigned int));
offset += (sizeof(long unsigned int));
memcpy(payload + offset, &packet->payload.offset, sizeof(long int));
packet->header.payload_lenght = offset+1; // Here I get payload's length
offset = 0;
// Same procedure here, but for the entire packet, including the header.
memcpy(buffer, &packet->header.pct_type, sizeof(char));
offset = sizeof(char);
memcpy(buffer + offset, &packet->header.payload_lenght, sizeof(short int));
offset += sizeof(short int);
memcpy(buffer + offset, packet->payload.path,
strlen(packet->payload.path) + 1);
offset += strlen(packet->payload.path + 1);
memcpy(buffer + offset, &packet->payload.size, sizeof(long unsigned int));
offset += (sizeof(long unsigned int));
memcpy(buffer + offset, &packet->payload.offset, sizeof(long int));
return buffer;
}
t_pct_read* deserialize_read(char* stream) {
t_pct_read* packet = malloc(sizeof(t_pct_read));
int offset;
int alloc_size;
memcpy(&packet->header.pct_type, stream, sizeof(char));
offset = sizeof(char);
memcpy(&packet->header.payload_lenght, stream + offset, sizeof(short int));
offset += sizeof(short int);
for (alloc_size = 1; (stream + offset)[alloc_size - 1] != '\0';
alloc_size++) {
packet->payload.path = malloc(alloc_size)+1;
}
memcpy(packet->payload.path, stream + offset, alloc_size+1);
offset += strlen(packet->payload.path);
memcpy(&packet->payload.size, stream + offset, sizeof(long unsigned int));
offset += (sizeof(long unsigned int));
memcpy(&packet->payload.offset, stream + offset, sizeof(long int));
return packet;
}
其思想是序列化一个结构(NIPC数据包结构),通过TCP发送到另一个进程,然后反序列化并重新构建该结构。但不知怎么的,我不能让它正常工作,只是局部的。以下是结构
typedef struct {
char pct_type;
short int payload_lenght;
}__attribute__((__packed__)) t_header;
typedef struct {
char* path;
long unsigned int size;
long int offset;
}__attribute__ ((__packed__)) t_payload_read;
typedef struct {
t_header header;
t_payload_read payload;
}__attribute__ ((__packed__)) t_pct_read;
然后,我首先序列化有效负载(偏移量、大小和路径),以计算有效负载的长度,然后是整个数据包,包括发送它的报头。然后反序列化,但没有办法让它工作,另一方面,我得到了头OK和路径字段“OK”,但我得到了偏移量和大小的奇怪数字,例如,使用结构上的硬编码值:
type: 4
offset: 5
size: 15
path: ~/Desarrollo/Workspace
我得到:
pct->header.pct_type: 4
pct->header.payload_length: 28
pct->payload.path: ~/Desarrollo/Workspac
pct->payload.size: 143994937
pct->payload.offset: 143994941
在这里,我附加了我设计的序列化和反序列化函数,我试图尽可能地描述和仔细
char* serialize_read(t_pct_read* packet) {
char* buffer = malloc(
sizeof(t_header) + sizeof(packet->payload.offset)
+ sizeof(packet->payload.size)
+ strlen(packet->payload.path + 1));
char* payload = malloc(
sizeof(packet->payload.offset) + sizeof(packet->payload.size)
+ strlen(packet->payload.path) + 1);
int offset;
// First I serialize the Payload, in order to calculate It's lenght
memcpy(payload, packet->payload.path, strlen(packet->payload.path) + 1);
offset = strlen(packet->payload.path)+1;
memcpy(payload + offset, &packet->payload.size, sizeof(long unsigned int));
offset += (sizeof(long unsigned int));
memcpy(payload + offset, &packet->payload.offset, sizeof(long int));
packet->header.payload_lenght = offset+1; // Here I get payload's length
offset = 0;
// Same procedure here, but for the entire packet, including the header.
memcpy(buffer, &packet->header.pct_type, sizeof(char));
offset = sizeof(char);
memcpy(buffer + offset, &packet->header.payload_lenght, sizeof(short int));
offset += sizeof(short int);
memcpy(buffer + offset, packet->payload.path,
strlen(packet->payload.path) + 1);
offset += strlen(packet->payload.path + 1);
memcpy(buffer + offset, &packet->payload.size, sizeof(long unsigned int));
offset += (sizeof(long unsigned int));
memcpy(buffer + offset, &packet->payload.offset, sizeof(long int));
return buffer;
}
t_pct_read* deserialize_read(char* stream) {
t_pct_read* packet = malloc(sizeof(t_pct_read));
int offset;
int alloc_size;
memcpy(&packet->header.pct_type, stream, sizeof(char));
offset = sizeof(char);
memcpy(&packet->header.payload_lenght, stream + offset, sizeof(short int));
offset += sizeof(short int);
for (alloc_size = 1; (stream + offset)[alloc_size - 1] != '\0';
alloc_size++) {
packet->payload.path = malloc(alloc_size)+1;
}
memcpy(packet->payload.path, stream + offset, alloc_size+1);
offset += strlen(packet->payload.path);
memcpy(&packet->payload.size, stream + offset, sizeof(long unsigned int));
offset += (sizeof(long unsigned int));
memcpy(&packet->payload.offset, stream + offset, sizeof(long int));
return packet;
}
撇开样式问题不谈,反序列化函数中有一个或多个错误。而不是
offset += strlen(packet->payload.path);
使用
strlen(packet->payload.path+1)
看起来可疑,尤其是与strlen(packet->payload.path)+1)
你确定这就是你的意思吗?谢谢!,这显然是我的一个错误,但它仍然不起作用,不知何故路径仍然是“~/Desarrollo/Workspac”,没有最后的“e”,我怀疑这就是反序列化中断的点,以及为什么我在“大小”和偏移量上得到这些数字“有什么想法吗?”再次感谢你的帮助,伙计!我仔细检查了一下,你说得对,谢谢!。我仍然在输出上遇到同样的问题。我感到困惑的一点是,“\0”分隔符是何时放置的?或者我是否应该手动将其附加到路径?因为我这样硬编码了结构的“路径”值。pct_read->payload.path=“~/desarrolo/Workspace”;我不知道它是怎么解决的。再次感谢你帮助我!