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

       在进行Socket开发时,会遇到“封包与拆包”的问题,封包和拆包过程中,会涉及到结构体指针与字符指针间的强制转换,对于初步接触的开发人员来说,可能会不知道从哪里突破,故将自己的经验总结一下,由于也是刚开始接触编程,可能看到的仅是冰山一角,有不恰当或不完善的地方还希望能留言指正。

封包:将包头与信息封装成一定大小的包,作为发送单元进行发送。

下面是一个包头定义的一个例子:

/*-------包头开始----------*/
#pragma pack(push,1) //开始定义数据包,采用字节对齐
struct PACKAGEHEAD
{
WORD command;  //命令
WORD packageNum; //总包数
WORD packageNo;  //包编号
WORD  totalSize;  //信息总长度
WORD  curSize;    //包当前长度
WORD  crcCheck;   //校验
};
#pragma pack(pop) //结束定义数据包,恢复原来的对齐方式
/*-------包头结束----------*/


定义好包头后,还需要编写封包程序,此时就涉及到char*指针强制转换成一个指向结构体的指针。

char*指针强制转换成一个指向结构体的指针的可行性:指针其实就是一个地址, 指向一段内存, 至于怎么解释这段内存就得看这个指针是什么类型,内容是以字符串传输的,现在想以结构体解析出来,这样是可以的。


试验代码如下:

#include "stdafx.h"
#include <string>
#include <iostream>

using namespace std;
struct test     //定义一个测试结构体
{
int a;
double b;
char c;
string str;
};


int main(int argc, _TCHAR* 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*缓存区强制转换成结构体指针
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;

getchar();
return 0;

}


运行结果:

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


可以看到对于同一段内存区,只要结构体指针与字符指针间的强制转换有所掌控,就能实现结构体的在字符串缓存区的写入和读取。


版权声明:本文为博主原创文章,转载请注明出处。