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