gpt4 book ai didi

c++ - 带有预告片的可变大小结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:33 24 4
gpt4 key购买 nike

我发布了这个主题earlier但现在我有一个更具体的问题。

这是我的代码:

#include <cstdlib>
#include <iostream>

typedef struct{
unsigned int h;
unsigned int b[];
unsigned int t;
} pkt;

int main(){

unsigned int* arr = (unsigned int*) malloc(sizeof(int) * 10);
arr[0] = 0xafbb0000;
arr[1] = 0xafbb0001;
arr[2] = 0xafbb0011;
arr[3] = 0xafbb0111;
arr[4] = 0xafbb1111;
arr[5] = 0xafbc0000;
arr[6] = 0xafbc0001;
arr[7] = 0xafbc0011;
arr[8] = 0xafbc0111;
arr[9] = 0xafbc1111;

pkt* p = (pkt*) malloc(sizeof(int)*13);
p->h = 0x0905006a;

int counter;

这是我得到的 对于(计数器=0;计数器<10;计数器++) p->b[计数器] = arr[计数器];

    p->t = 0x55555555;

std::cout << "header is \n" << p->h << std::endl;
std::cout << "body is" << std::endl;
for(counter=0; counter < 10;++counter)
std::cout << std::hex << *((p->b)+counter) << std::endl;
std::cout << "trailer is \n" << p->t << std::endl;

这是我得到的

header is 
151322730
body is
55555555
afbb0001
afbb0011
afbb0111
afbb1111
afbc0000
afbc0001
afbc0011
afbc0111
afbc1111
trailer is
55555555

*(p->b) 被预告片替换了!如果我删除分配预告片的行,即 p->t=0x55555555;,那么预告片和 p->b 是相同的 (afbb0000)。

所以我的问题是,我怎样才能保持结构在顶部的定义,并使这个数据包正常运行。

编辑:

我应该更清楚。我为网络应用程序编写此代码,因此我必须制作一个数据包,其中输出的顺序完全相同,我正在通过写入文件并进行十六进制转储来测试它。所以我的问题真的是:

如何使带有 header 、可变大小主体和尾部的数据包始终具有此顺序?我能想到的唯一两个解决方案是具有许多不同的结构,或者具有一个 vector 。

也就是说,我可以构造 where

typedef struct{
unsigned int h;
unsigned int b[12];
unsigned int t;
} pkt1;

typedef struct{
unsigned int h;
unsigned int b[102];
unsigned int t;
} pkt2;

etc

或者我可以做

std::vector<unsigned int> pkt (12);
pkt[0] = header;
pkt[1] = data;
...
pkt[2]= data;
pkt[11] = trailer;

不过,我不太喜欢这两种解决方案。有没有更好的办法??

此外,这是一个单独的问题,我将不得不为接收数据做同样的事情。将数据 block 转换为 vector 之类的事情是明智的吗?我将以 void* 形式接收数据,并且我会知道最大长度。

最佳答案

尝试更新结构,然后添加以下内容:

typedef struct{
unsigned int h;
unsigned int* b;
unsigned int t;
} pkt;

...
...

pkt p;
p->b = arr

这是它正在做什么的一个可视化示例...

|----------------------|
| header |
|----------------------|
| B int* | ------- p->b = arr
|----------------------| |
| trailer | |
|----------------------| v
|----------------------|
arr | |
| B items [0 ... N] |
| |
|----------------------|

如果你想变得棘手,你可以做这样的事情......

|----------------------|
| header |
|----------------------|
| B int* | ------- (= to memory address after trailer)
|----------------------| |
| trailer | |
|----------------------| |
| | <-------
| B items [0 ... N] |
| |
|----------------------|

这是后者的工作版本:

#include "stdlib.h"
#include "stdio.h"
#include "malloc.h"

typedef struct{
unsigned int h;
unsigned int* b;
unsigned int t;
} pkt;

int main(){

pkt* p = (pkt*) malloc( sizeof(pkt) + sizeof(int)*10);
p->h = 0x0905006a;
p->b = &(p->t)+1;
p->t = 0x55555555;

p->b[0] = 0xafbb0000;
p->b[1] = 0xafbb0001;
p->b[2] = 0xafbb0011;
p->b[3] = 0xafbb0111;
p->b[4] = 0xafbb1111;
p->b[5] = 0xafbc0000;
p->b[6] = 0xafbc0001;
p->b[7] = 0xafbc0011;
p->b[8] = 0xafbc0111;
p->b[9] = 0xafbc1111;

int counter;
printf( "header is \n" );
printf( "%0x\n", p->h);
printf( "body is\n" );
for(counter=0; counter < 10;++counter)
printf( "%0x\n", (p->b)[counter]);
printf( "trailer is\n" );
printf( "%0x\n", p->t );
}

关于c++ - 带有预告片的可变大小结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1257638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com