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);
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;
}
运行结果:
可以看到对于同一段内存区,只要对结构体指针与字符指针间的强制转换有所掌控,就能实现结构体的在字符串缓存区的写入和读取。
版权声明:本文为博主原创文章,转载请注明出处。