日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C++:将char*指针强制转换成一个指向结构体的指针

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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*指针强制转换成一个指向结构体的指针的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。