C++:将char*指针强制转换成一个指向结构体的指针
在使用Socket與雷達(dá)進(jìn)行通信采集數(shù)據(jù)時(shí),會(huì)遇到“打包與解包”的問題,在打包和解包過程中,會(huì)涉及到結(jié)構(gòu)體指針與字符指針間的強(qiáng)制轉(zhuǎn)換。如下:
打包就是將包頭與信息封裝成一定大小的包,作為發(fā)送單元進(jìn)行發(fā)送。
1、首先將雷達(dá)數(shù)據(jù)格式進(jìn)行打包:(把數(shù)據(jù)格式打包成一種結(jié)構(gòu)體數(shù)據(jù)類型)
typedef struct _tag_OLE2D_Block
{DWORD Header;//標(biāo)識(shí)符//typedef unsigned long DWORD;WORD ProtocolVersion;//協(xié)議版本W(wǎng)ORD類型實(shí)際上就是一個(gè)無符號(hào)的短整型BYTE Ratio; //距離比例CHAR Manufactor[3];//品牌商代碼CHAR Model[12];//銷售型號(hào)字符串WORD ModelID;//內(nèi)部型號(hào)代碼WORD HardwareVersion;//硬件版本W(wǎng)ORD SoftwareVersion;//軟件版本DWORD Timestamp;//時(shí)間戳(ms)WORD Rotate;//轉(zhuǎn)速BYTE SafeStatus;//安全區(qū)域BYTE ErrorStatus;//錯(cuò)誤狀態(tài)DWORD Reserved[1];//保留struct Point2D//結(jié)構(gòu)里邊有一個(gè)成員是結(jié)構(gòu){WORD Angle;WORD Distance;WORD Intensity;WORD Reversed;}Points[150];//11111111111111111111111111111111111111111111結(jié)構(gòu)要擴(kuò)展
}OLE2D_Block;//是一個(gè)數(shù)據(jù)結(jié)構(gòu)(雷達(dá)反饋數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),OLE2D_Block結(jié)構(gòu)體的實(shí)例)
定義好包頭后,還需要編寫打包程序,此時(shí)就涉及到char*指針強(qiáng)制轉(zhuǎn)換成一個(gè)指向結(jié)構(gòu)體的指針。
char*指針強(qiáng)制轉(zhuǎn)換成一個(gè)指向結(jié)構(gòu)體的指針的可行性:指針其實(shí)就是一個(gè)地址,?指向一段內(nèi)存,?至于怎么解釋這段內(nèi)存就得看這個(gè)指針是什么類型,內(nèi)容是以字符串傳輸?shù)?#xff0c;現(xiàn)在想以結(jié)構(gòu)體解析出來,這樣是可以的。
比如:
char pBuf[65536]//定義字符數(shù)據(jù)接收通信傳輸數(shù)據(jù)...proceedata(char* recv)//其中參數(shù)char* recv是定義字符指針,來作為數(shù)據(jù)處理這個(gè)函數(shù)所要處理的數(shù)據(jù)
//而我們將數(shù)據(jù)結(jié)構(gòu)做以打包,所以使用socket通信獲取的數(shù)據(jù)是字符串的形式,故需要將字符串也就是字符數(shù)組形式的數(shù)據(jù)轉(zhuǎn)化為結(jié)構(gòu)體指針的形式
{.....OLE2D_Block* pBlock = (OLE2D_Block*)recv//這里就是將傳參進(jìn)來的recv字符指針強(qiáng)制轉(zhuǎn)化為結(jié)構(gòu)體指針
}
案例演示:
#include <iostream>
#include<stdlib.h>
#include<stdio.h>using namespace std;
typedef struct test
{int a;double b;char c;string str;
};//定義一個(gè)測(cè)試結(jié)構(gòu)體int main(int argc, char* argv[])
{char* pData = NULL;pData = new char[100]; //申請(qǐng)一個(gè)字符串緩存區(qū),用于存放發(fā)送(或接收)的包數(shù)據(jù)memset(pData, 0, 100);test* a = (test*)pData;//定義一個(gè)結(jié)構(gòu)體指針,并把char*緩存區(qū)強(qiáng)制轉(zhuǎn)換成結(jié)構(gòu)體指針a->a = 1;//可以對(duì)緩存區(qū)進(jìn)行賦值,這可以理解為包頭信息寫入到緩存區(qū)a->b = 2.0;a->c = 'c';a->str = "abcd";cout << "a的地址:" << a << endl;//查看緩存區(qū)的值cout << "a->a:" << a->a << endl;cout << "a->b:" << a->b << endl;cout << "a->c:" << a->c << endl;cout << "a->str:" << a->str << endl;cout << endl;test* b = (test*)pData;//定義一個(gè)結(jié)構(gòu)體指針,并把char*緩存區(qū)強(qiáng)制轉(zhuǎn)換成結(jié)構(gòu)體指針b->a =3;//可以對(duì)緩存區(qū)進(jìn)行賦值,這可以理解為包頭信息寫入到緩存區(qū)b->b = 4.0;b->c = 'd';b->str = "efgh";cout << "b的地址:" << b << endl;//直接輸出緩存區(qū)的數(shù)據(jù),相當(dāng)于從接收緩存區(qū)將包頭信息提取的過程cout << "b->a:" << b->a << endl;cout << "b->b:" << b->b << endl;cout << "b->c:" << b->c << endl;cout << "b->str:" << b->str << endl;cout << endl;cout << "a的地址:" << a << endl;//查看緩存區(qū)的值cout << "a->a:" << a->a << endl;cout << "a->b:" << a->b << endl;cout << "a->c:" << a->c << endl;cout << "a->str:" << a->str << endl;cout << endl;return 0;
}
結(jié)果如下:
打印的地址都一樣
PS:
(1)void?(*fun)(long*?p);//聲明函數(shù)
?????fun?dest;//此處fun是一個(gè)函數(shù)指針,是一個(gè)變量,不能用變量定義變量,所以會(huì)出錯(cuò)。
(2)typedef?void?(*fun)(long?*p);//此時(shí),fun是一個(gè)函數(shù)指針類型(因?yàn)槎嗔艘粋€(gè)typedef)
?????fun?dest;//用類型定義變量是當(dāng)然可以的啊
函數(shù)指針和指針函數(shù):https://blog.csdn.net/luoyayun361/article/details/80428882?utm_term=%E6%8C%87%E9%92%88%E5%87%BD%E6%95%B0%E5%92%8C%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88%E6%9C%89%E5%95%A5%E7%94%A8&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-1-80428882&spm=3001.4430
總結(jié)
以上是生活随笔為你收集整理的C++:将char*指针强制转换成一个指向结构体的指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pytorch的神经网络编程学习第一节
- 下一篇: 深蓝学院的三维点云课程:第一章