我有一个包含数据大小和数据本身的数据结构,并且我还有两个函数对相同的结构进行反序列化。
请注意,这些序列化功能并不完全实用或有效。
我的import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
结构:
data_t
我的函数struct data_t {
int datasize;
void *data;
};
将结构转换为缓冲区:
data_To_buffer
我的函数int data_to_buffer(struct data_t *data, char **data_buf) {
if (data == NULL || data_buf == NULL)
return -1;
int buf_size = INT_S + data -> datasize;
*data_buf = malloc(buf_size);
char *buf_ptr = *data_buf;
int int_v = htonl(data -> datasize);
memcpy(buf_ptr, &int_v, INT_S);
buf_ptr += INT_S;
memcpy(buf_ptr, data -> data, data -> datasize);
return buf_size;
}
将缓冲区转换为data_t对象。
buffer_to_data
问题
在我测试这些功能的struct data_t *buffer_to_data(char *data_buf, int data_buf_size) {
if(data_buf == NULL || data_buf_size <= 0)
return NULL;
int size = ntohl(* (int *) data_buf);
data_buf += INT_S;
struct data_t *data = data_create(size);
memcpy(data -> data, data_buf, data -> datasize);
printf("\n SIZE: %d", data -> datasize); <- OK = 14
printf("\n Data: %s\n", data -> data); <- OK = 1234567890abc
return data;
}
上,尝试打印反序列化数据的值时出现错误。
请注意,当我在main
函数中打印data
和datasize
时,根本没有问题,只有在我返回数据后才会发生错误。
buffer_to_data
答案 0 :(得分:0)
这里:
memcpy(buf_ptr, &int_v, INT_S);
您缺少对内部缓冲区的取消引用,而是覆盖了传递的指针
固定线路:
memcpy(*buf_ptr, &int_v, INT_S);
这里有同样的错误:
buf_ptr += INT_S;
memcpy(buf_ptr, data -> data, data -> datasize);
固定的变体形式:
memcpy(*buf_ptr + INT_S, data -> data, data -> datasize);