如何在结构体里面套结构体_小技巧:变长结构体设计

问题

在设计网络协议过程中,一般会有数据包头和数据包体。通常情况下,数据包头和数据包体长度是固定的。但是在某些特殊场景下,需要传输的数据量不是固定的,这个时候,就需要在数据包体中引入变长结构体的设计了。

以下是参考代码

数据包头:

cda1f582998569e14dd3022d62868f11.png

数据包体:

c4550befc9b0c34b2d19d04ceb8cbc1a.png

数据包:

a5fe4d0d4f0d8a3f8032cccf16b069b7.png

代码解析

这里使用到技巧是:在数据包体中定义了一个没有任何元素的字节数组,当构建数据包体时,我们需要动态分配堆内存并将包体成员m_pPayload指向此堆内存。如下的代码演示了,如何构建一个变长的数据包体:

例如,数据包体载荷长度设定为3个字节

int nPayloadLen = 3;

整个数据包体的长度定义如下:

int nBodyLen = sizeof(MsgBody) + nPayloadLen];

随机生成数据包体载荷

BYTE arrData[nPayloadLen] = {0x11, 0x22, 0x33};

分配堆内存并拷贝数据到数据包体

Package package;

package.m_body = reinterpret_cast(new BYTE[nBodyLen]);

memset(package.m_body, 0, nBodyLen);

package.m_body->m_nPayloadLen = nBodyLen;

memcpy(m_body->m_pPayload, arrData, nPayloadLen);

那么,使用此变长数据包体就变得简单了,代码如下:

MsgBody * pBody = reinterpret_cast(package.m_body);

BYTE a = pBody->m_pPayload[0];

BYTE b = pBody->m_pPayload[1];

BYTE c = pBody->m_pPayload[2];

关于C4200警告

此设计方法有时候会产生C4200警告,我们可以使用如下方法禁止此警告,

在变长结构体定义之前,添加如下语句即可

#pragma warning(disable : 4200)

90fe0a0427a875d4928a0c98045f66c1.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值