【问题标题】:Serialization of packages with C使用 C 对包进行序列化
【发布时间】:2012-07-21 05:47:23
【问题描述】:

我是新来的,我很喜欢你的帮助。 我试图序列化和反序列化一个包(在套接字中使用它),结果不是我期望的,但我找不到错误。这是代码。

typedef struct {
    int32_t size;
    char data[1024];
} t_socket_buffer;

typedef struct {
    int16_t payloadLength;
    int8_t type;
    char *path;
} ReadRequestPackage;

序列化的函数

t_socket_buffer *Open_serializer(ReadRequestPackage *ReadPackage){
char data[1024];
t_socket_buffer *stream = malloc(sizeof(t_socket_buffer));
int8_t offset = 0, tmp_size = 0;


memcpy(data, &ReadPackage->payloadLength, tmp_size = sizeof(int16_t));

offset = tmp_size;
memcpy(data + offset,&ReadPackage->type, tmp_size = sizeof(int8_t));


offset+= tmp_size;
memcpy(data + offset, ReadPackage->path,tmp_size = strlen(ReadPackage->path)+1);


stream->size = offset + tmp_size;
memcpy(stream->data, data,strlen(data)+1);

return stream;

    }

反序列化的函数

    ReadRequestPackage *Open_deserializer(t_socket_buffer *stream)
    {
ReadRequestPackage *ReadPackage = malloc(sizeof(ReadRequestPackage));
int32_t offset = 0, tmp_size = 0;

memcpy(&ReadPackage->payloadLength,stream->data,tmp_size = sizeof(int16_t));

offset = tmp_size;
memcpy(&ReadPackage->type, stream->data + offset, tmp_size = sizeof(int8_t));

offset += tmp_size;
for(tmp_size = 1; (stream->data + offset)[tmp_size-1]!='\0';tmp_size++);
ReadPackage->path = malloc(tmp_size);
memcpy(ReadPackage->path, stream->data + offset, tmp_size);



return ReadPackage;

     }

当我用这个 main() 测试它时

int main (void){
ReadRequestPackage *pqt1 = malloc(sizeof(ReadRequestPackage));
ReadRequestPackage *pqt2;

t_socket_buffer *stream;
pqt1->path=malloc(sizeof("directory"));
strcpy(pqt1->path,"directory");
pqt1->payloadLength = strlen("directory")+1+sizeof(int8_t);
pqt1->type  = 1;

stream = Open_serializer(pqt1);
pqt2 = Open_deserializer(stream);
printf("path 1: ");
puts(pqt1->path);
printf("path 2: ");
 puts(pqt2->path);
printf("\ntype1:%d ",pck1->type);
printf("\ntype2:%d ",pck2->type);
printf("\nize:%d ",pck1->payloadLength);
printf("\nsize:%d ",pck2->payloadLength);

return 1;
}

结果不一样,应该的!

非常感谢!

【问题讨论】:

    标签: c sockets serialization deserialization packages


    【解决方案1】:
    memcpy(stream->data, data,strlen(data)+1);
    

    这条线没有做你认为它正在做的事情。 data 不是字符串。

    顺便说一句,您是否考虑过使用适当的序列化库?

    【讨论】:

    • 你可能应该补充一点,他应该使用sizeof 或类似的而不是strlen
    • @RichardJ.RossIII 我希望它应该是stream->size
    • 感谢您的回答。我不能使用序列化库,因为我应该这样做。那你建议我做什么?
    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多