C++中二进制数据序列化和反序列化详解
一、基础知识
1、memcpy:内存拷贝函数
函数原型:void *memcpy(void *dest, const void *src, size_t count);
2、代码编写(采用循环的方式将字节内容逐一拷贝)
void* my_memcpy(void* dest, const void* src, size_t count) { assert(dest); //防止函数接受空指针进行操作 assert(src); void* ret = dest; while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; }
3、c_str()函数:可以将const string* 类型 转换为 const char* 类型
二、什么是数据序列化和数据反序列化
数据序列化:将对象变成字节流的形式传出去
数据反序列化:从字节流恢复成原来的对象
三、为什么需要读数据进行序列化和反序列化处理
1、序列号可以将数据转换为一种格式,使其容易通过网络进行传输和存储。反序列化则可以将序列化后的数据还原为原始形式,以便后续进行处理
2、内存中对象转换为二进制数据:当需要将对象的状态传输到远程机器,或将其存储在磁盘上时,就需要将对象转换为二进制数据。
3、二进制数据转换为内存中的对象:当需要从远程机器或磁盘中读取对象状态时,需要将已序列化的二进制数据转换为原始对象。
四、数据序列化处理
struct Student { string name; string grade; int age; double scale; }; //数据序列化 char* serialization(Student* student) { int size = sizeof(Student); char* pBuf = new char[size]; //记录指针的位置 int num = 0; memcpy((pBuf + num), student->name.c_str(), 8); num += 8; memcpy((pBuf + num), student->grade.c_str(), 8); num += 8; *(int *)(pBuf + num) = student->age; num += 4; *(double*)(pBuf + num) = student->scale; return pBuf; }
五、数据反序列化处理
void deserialization(char* data) { string name; string garde; int age; double scale; //记录指针的位置 int num = 0; name = (data + num); num += 8; garde = (data + num); num += 8; age = *(int*)(data + num); num += 4; scale = *(double*)(data + num); cout << "name:" << name << endl; cout << "garde:" << garde << endl; cout << "age:" << age << endl; cout << "scale:" << scale << endl; }
六、运行处理
int main() { Student student; student.name = "Jim"; student.grade = "ten"; student.age = 12; student.scale = 88; char* data = serialization(&student); deserialization(data); return 0; }
以上就是C++中二进制数据序列化和反序列化详解的详细内容,更多关于C++二进制数据序列化和反序列化的资料请关注脚本之家其它相关文章!
相关文章
c++ error:crosses initialization of问题解决分析
这篇文章主要介绍了c++ error:crosses initialization ofde 问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-08-08
最新评论