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

45 篇文章 1 订阅
8 篇文章 0 订阅

       在进行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;

}


运行结果:



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


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

  • 0
    点赞
  • 22
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Hello-12345

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值