首页
社区
课程
招聘
[求助]如何填充如下结构体?
发表于: 2012-3-31 20:22 7030

[求助]如何填充如下结构体?

2012-3-31 20:22
7030
01 01 01  //头
02 31 31   //02是长度  31 31 是"11"   这里的长度和字符都是动态的
02 02 02 //尾

也有可能是
01 01 01  //头
05 31 31 32 33 33   完全是动态.
03 03 03 //尾

typedef struct _xx
{
     BYTE  arr1[3];//开头的3字节
   BYTE   len; //字符串的长度
   char    str[len];//???  这个地方怎么声明好???  使其在用的时候可以直接 memcpy 而结构体不乱?
    BYTE  arr2[3];//尾部3字节
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
动态的那就放指针呗
2012-3-31 20:24
0
雪    币: 4333
活跃值: (4323)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
求解... ...

现在就是不想很麻烦的一个个去存指针  因为数据量非常大.

而且存指针的话  那指针是4字节  或者 用一个 BYTE 来指向开始(使用时直接 char *)

但那样做就得一个个去解悉了,非常麻烦  不然怎么保存最后一个结构成员的位置呢?      如果copy的话 后面的数据就无法对齐
2012-3-31 20:32
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
“05 31 31 32 33 33   完全是动态”把这个定义为一个结构体a

typedef struct _xx
{
     BYTE  arr1[3];//开头的3字节
   结构体a
    BYTE  arr2[3];//尾部3字节
}

对于结构体的操作你可以很方便的使用指针来操作,一点不麻烦...
一般不用memcpy,因为结构体加载到内存可能考虑内存对齐的问题memcpy操作可能不正确得到数据.
2012-3-31 21:26
0
雪    币: 4333
活跃值: (4323)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=小覃;1059374]“05 31 31 32 33 33   完全是动态”把这个定义为一个结构体a

typedef struct _xx
{
     BYTE  arr1[3];//开头的3字节
   结构体a
    BYTE  arr2[3];//尾部3字节
}

对于结构体的操作你可以很...[/QUOTE]

typedef struct  _a
{
    BYTE  len;
    char  *p
}

???   这样子?
2012-3-31 22:05
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
是的     。
2012-3-31 23:16
0
雪    币: 183
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
LZ最近很活跃啊:
2012-3-31 23:48
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
8
大四了没课,工作也没有就闲了..
2012-4-1 00:37
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
这么晚了都不断电?
2012-4-1 01:14
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
我以为定义为结构体不可行,还是用指针
2012-4-1 01:20
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
11
今天是周末哦!
2012-4-1 01:24
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
我们周末只到11点45,平常10点45。你那动态结构体不可能的吧,听都没听说过。
2012-4-1 01:29
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
13
都可以的..
2012-4-1 01:36
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
14
指针也可以,结构也没问题,看你的习惯,
最终还是要看你怎么读这块数据了,效果是一样的~
你可以参看一下Pe文件的NT头
2012-4-1 01:43
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
以前想都没敢想过,果然太死板了,示例有吗,没见过的东西不知道什么样,不知道去哪找。
2012-4-1 01:47
0
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
16
中间填充区域放个 *p,然后自己申请内存。

ps:微软的很多结构体都是这样的。
2012-4-1 12:01
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
std::string搞起
2012-4-2 12:33
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
18
终于想到了
struct{
BYTE head[3];
BYTE length;
}PacketHead;

struct{
BYTE head[3];
BYTE length;
BYTE data[1];
}*pPacket;

先读4字节到PacketHead里,用它的length+3+1+3申请内存赋到pPacket,再将PacketHead复制到pPacket开头,最后读取剩余的部分。
2012-4-6 04:33
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
19
更好一点的方案,就是一次性分一个较大的内存,防止内存碎片,这时就不用先读取到PacketHead了,可读到pPacket但仍需先读4字节,根据length判断是否会溢出,是则头部保存到PacketHead,释放并重新分配更大的内存。
2012-4-6 04:55
0
游客
登录 | 注册 方可回帖
返回
//