这样的结构怎么构造好?

ming6 2006-07-10 09:38:29
typedef struct
{
int wReserved1; // 保留字
int wReserved2; // 保留字
int wLen; // 数据包长度,即sizeof(byData)
char Data[496]; // 数据本身,最长496字节,格式见具体通讯协议。
} MYDATA;

Data的长度是可变的,最大为496字节,根据wLen而定,wLen为N时,Data的长度就为N*4(N大于等于1,小于等于496/4)
这个结构我要通过网络发送出去
所以我希望Data每次占用的字节都恰好,而不是每次都占用最大字节,也就是说wLen=1时,Data就4字节,wLen=2时,Data就8个字节
...全文
203 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ming6 2006-07-12
  • 打赏
  • 举报
回复
charData[496];// 这个项定义成指针,内存空间根据N在堆里面分配,不行吗
----------
问题是我需要通过网络把结构发出去

定义成指针,那发出去的结构中的data不就只是一个指针了吗
yingpf 2006-07-11
  • 打赏
  • 举报
回复
charData[496];// 这个项定义成指针,内存空间根据N在堆里面分配,不行吗

ming6 2006-07-11
  • 打赏
  • 举报
回复
可以的,你的结构定义成这样的,你要用
#pragma pack(1)
#pragma pack()
send 的时候,定义一个指针指向结构的首,再把这个长度计算一下,发出去就可以了
------------
你意思是定义结构还是定义成Data[496],只不过发送时根据wLen来发
是不是这样理解
DentistryDoctor 2006-07-10
  • 打赏
  • 举报
回复
char Data[1]只是表示这儿有这么一个字段而已。具体的长度,需要协议自己去解释。
Win32中的很多结构都采用这样的方式定义。如果你需要假设wLen=100

MYDATA *myData = reinterpret_cast<MYDATA*>(new BYTE[offsetof(MYDATA, Data) + wLen]);
...
ming6 2006-07-10
  • 打赏
  • 举报
回复
可以的,你的结构定义成这样的,你要用
#pragma pack(1)
#pragma pack()
send 的时候,定义一个指针指向结构的首,再把这个长度计算一下,发出去就可以了
------------
你意思是定义结构还是定义成Data[496],只不过发送时根据wLen来发
ming6 2006-07-10
  • 打赏
  • 举报
回复
typedef struct
{
int wReserved1; // 保留字
int wReserved2; // 保留字
int wLen; // 数据包长度,即sizeof(byData)
char Data[1]; // 数据本身,最长496字节,格式见具体通讯协议。
} MYDATA;

每次都从堆上分配合适大小的内存。
怎么是char Data[1]?
章月庭 2006-07-10
  • 打赏
  • 举报
回复
可以的,你的结构定义成这样的,你要用
#pragma pack(1)
#pragma pack()
send 的时候,定义一个指针指向结构的首,再把这个长度计算一下,发出去就可以了
DentistryDoctor 2006-07-10
  • 打赏
  • 举报
回复
typedef struct
{
int wReserved1; // 保留字
int wReserved2; // 保留字
int wLen; // 数据包长度,即sizeof(byData)
char Data[496]; // 数据本身,最长496字节,格式见具体通讯协议。
} MYDATA;
=>
typedef struct
{
int wReserved1; // 保留字
int wReserved2; // 保留字
int wLen; // 数据包长度,即sizeof(byData)
char Data[1]; // 数据本身,最长496字节,格式见具体通讯协议。
} MYDATA;

每次都从堆上分配合适大小的内存。
ming6 2006-07-10
  • 打赏
  • 举报
回复
那你就跟据wLen长度去取数据就行了,这个规则是你自已定你自已应该知道怎样去读与写
----------------

我不明白你指的是用什么办法?
mynamelj 2006-07-10
  • 打赏
  • 举报
回复
那你就跟据wLen长度去取数据就行了,这个规则是你自已定你自已应该知道怎样去读与写
ming6 2006-07-10
  • 打赏
  • 举报
回复
char只占1个字节,不是4个
---------------
char是占一个字节

怎么了?

mynamelj 2006-07-10
  • 打赏
  • 举报
回复
char只占1个字节,不是4个
ming6 2006-07-10
  • 打赏
  • 举报
回复
char Data[1]只是表示这儿有这么一个字段而已。具体的长度,需要协议自己去解释。
Win32中的很多结构都采用这样的方式定义。如果你需要假设wLen=100

MYDATA *myData = reinterpret_cast<MYDATA*>(new BYTE[offsetof(MYDATA, Data) + wLen]);
...
---------------------
首先必须要实例化一个结构再
取Data的偏移,然后根据wLen分配字节,对吧,这样直接用内存地址分配的空间不会破坏原来的数据吗?

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧