C++中二進(jìn)制數(shù)據(jù)序列化和反序列化詳解
一、基礎(chǔ)知識(shí)
1、memcpy:內(nèi)存拷貝函數(shù)
函數(shù)原型:void *memcpy(void *dest, const void *src, size_t count);

2、代碼編寫(xiě)(采用循環(huán)的方式將字節(jié)內(nèi)容逐一拷貝)
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest); //防止函數(shù)接受空指針進(jìn)行操作
assert(src);
void* ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}3、c_str()函數(shù):可以將const string* 類(lèi)型 轉(zhuǎn)換為 const char* 類(lèi)型
二、什么是數(shù)據(jù)序列化和數(shù)據(jù)反序列化
數(shù)據(jù)序列化:將對(duì)象變成字節(jié)流的形式傳出去
數(shù)據(jù)反序列化:從字節(jié)流恢復(fù)成原來(lái)的對(duì)象
三、為什么需要讀數(shù)據(jù)進(jìn)行序列化和反序列化處理
1、序列號(hào)可以將數(shù)據(jù)轉(zhuǎn)換為一種格式,使其容易通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸和存儲(chǔ)。反序列化則可以將序列化后的數(shù)據(jù)還原為原始形式,以便后續(xù)進(jìn)行處理
2、內(nèi)存中對(duì)象轉(zhuǎn)換為二進(jìn)制數(shù)據(jù):當(dāng)需要將對(duì)象的狀態(tài)傳輸?shù)竭h(yuǎn)程機(jī)器,或?qū)⑵浯鎯?chǔ)在磁盤(pán)上時(shí),就需要將對(duì)象轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。
3、二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為內(nèi)存中的對(duì)象:當(dāng)需要從遠(yuǎn)程機(jī)器或磁盤(pán)中讀取對(duì)象狀態(tài)時(shí),需要將已序列化的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為原始對(duì)象。
四、數(shù)據(jù)序列化處理
struct Student
{
string name;
string grade;
int age;
double scale;
};
//數(shù)據(jù)序列化
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;
}五、數(shù)據(jù)反序列化處理
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;
}六、運(yùn)行處理
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++中二進(jìn)制數(shù)據(jù)序列化和反序列化詳解的詳細(xì)內(nèi)容,更多關(guān)于C++二進(jìn)制數(shù)據(jù)序列化和反序列化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言if選擇結(jié)構(gòu)語(yǔ)句詳解
大家好,本篇文章主要講的是C語(yǔ)言if選擇結(jié)構(gòu)語(yǔ)句詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2021-12-12
MATLAB算法技巧和實(shí)現(xiàn)斐波那契數(shù)列的解決思路
這篇文章主要介紹了MATLAB算法技巧和實(shí)現(xiàn)斐波那契數(shù)列,這篇主要說(shuō)一下自己在算法設(shè)計(jì)課上用matlab做的兩道算法題,題目解起來(lái)都比較簡(jiǎn)單,但是需要些技巧,需要的朋友可以參考下2022-12-12
VC++文件監(jiān)控之ReadDirectoryChangesW
文章主要介紹文件監(jiān)控的另一種實(shí)現(xiàn)方式,利用ReadDirectoryChangesW來(lái)實(shí)現(xiàn)文件的監(jiān)控,希望對(duì)大家有幫助2019-04-04
C語(yǔ)言線(xiàn)性表順序表示及實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言線(xiàn)性表順序表示及實(shí)現(xiàn),線(xiàn)性表是最常用且最簡(jiǎn)單的一種數(shù)據(jù)結(jié)構(gòu)。簡(jiǎn)而言之,一個(gè)線(xiàn)性表是n個(gè)數(shù)據(jù)元素的有限序列2022-07-07
C++實(shí)現(xiàn)順序表的常用操作(插入刪出查找輸出)
實(shí)現(xiàn)順序表的插入,刪除,查找,輸出操作在C語(yǔ)言中經(jīng)常用到。下面小編給大家整理實(shí)現(xiàn)代碼,一起看下吧2016-08-08
C++編程中break語(yǔ)句和continue語(yǔ)句的學(xué)習(xí)教程
這篇文章主要介紹了C++編程中break語(yǔ)句和continue語(yǔ)句的學(xué)習(xí)教程,break和continue是C++循環(huán)控制中的基礎(chǔ)語(yǔ)句,需要的朋友可以參考下2016-01-01
windows下安裝QT及visual studio 2017搭建開(kāi)發(fā)環(huán)境
這篇文章主要介紹了windows下安裝QT及visual studio 2017搭建開(kāi)發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03

