dev*_*vin 1 c++ data-structures
我之前发布过这个主题,但现在我有一个更具体的问题/问题.
这是我的代码:
#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;
Run Code Online (Sandbox Code Playgroud)
这是我得到的(counter = 0; counter <10; counter ++)p-> b [counter] = arr [counter];
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;
Run Code Online (Sandbox Code Playgroud)
}
这就是我得到的
header is
151322730
body is
55555555
afbb0001
afbb0011
afbb0111
afbb1111
afbc0000
afbc0001
afbc0011
afbc0111
afbc1111
trailer is
55555555
Run Code Online (Sandbox Code Playgroud)
*(p-> b)被预告片取代!如果我删除了我分配预告片的行,即p-> t = 0x55555555;那么预告片和p-> b是相同的(afbb0000).
所以我的问题是,如何保持结构在顶部的定义方式,并使此数据包正常运行.
编辑:
我应该更清楚.我为网络应用程序写这个,所以我必须制作一个输出按照这个顺序排序的数据包,我通过写入文件并进行十六进制转储来测试它.所以我的问题是:
如何制作带有标题,可变大小的主体和预告片的数据包始终具有此顺序?我能想到的唯一两个解决方案是拥有许多不同的结构,或者有一个矢量.
也就是说,我可以在哪里结构
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
Run Code Online (Sandbox Code Playgroud)
或者我能做到
std::vector<unsigned int> pkt (12);
pkt[0] = header;
pkt[1] = data;
...
pkt[2]= data;
pkt[11] = trailer;
Run Code Online (Sandbox Code Playgroud)
我不喜欢这两种解决方案.有没有更好的办法??
此外,这是一个单独的问题,我将不得不做同样的事情来接收数据.做一些事情就像把数据块投射到矢量一样明智吗?我将以无效*的形式接收数据,我将知道最大长度.
尝试更新结构,然后添加以下内容:
typedef struct{
unsigned int h;
unsigned int* b;
unsigned int t;
} pkt;
...
...
pkt p;
p->b = arr
Run Code Online (Sandbox Code Playgroud)
这是一个关于它正在做什么的视觉例子......
|----------------------|
| header |
|----------------------|
| B int* | ------- p->b = arr
|----------------------| |
| trailer | |
|----------------------| v
|----------------------|
arr | |
| B items [0 ... N] |
| |
|----------------------|
Run Code Online (Sandbox Code Playgroud)
如果你想变得棘手,你可以做这样的事......
|----------------------|
| header |
|----------------------|
| B int* | ------- (= to memory address after trailer)
|----------------------| |
| trailer | |
|----------------------| |
| | <-------
| B items [0 ... N] |
| |
|----------------------|
Run Code Online (Sandbox Code Playgroud)
这是后者的工作版本:
#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 );
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
877 次 |
最近记录: |