在 C++ 中加入结构? [关闭]

Posted

技术标签:

【中文标题】在 C++ 中加入结构? [关闭]【英文标题】:join structs in c++? [closed] 【发布时间】:2014-10-29 18:56:13 【问题描述】:

我正在尝试创建一个以太网数据包加上 TCP/IP 有效负载,为此我创建了三个结构如下:以太网结构、tcp 结构和 ip 结构所有这些结构都填充了有效信息,但我没有知道我现在需要做什么,我需要将备用结构加入一个普通结构(例如数组),因为我想注入构造的数据包并且所有位都需要是连续的。

【问题讨论】:

我不知道你到底在问什么。请为您实际尝试的内容提供一个最小的代码示例,以详细说明您的问题! 标题说“加入 c++ 中的结构”或“将 c++ 中的结构附加到 BYTE 数组中”在这个意义上对我来说很清楚,尽管是为了什么。 【参考方案1】:

定义一个新类,将这三个结构体作为该类的实例变量、代码设置器和获取器。在编写 getter 时可能需要注意 const 的正确性 - 使用 const 关键字标记 getter。

struct EthStruct1

     // ...
;
struct EthStruct2

     // ...
;
struct EthStruct3

    // ...


class newClass

public :
     newClass()
     ~newClass()

     // Add functions to get and set values in A. Mark getters with const for immutability of receiver
     // Add functions to get and set values in B. Mark getters with const for immutability of receiver
     // Add functions to get and set values in C. Mark getters with const for immutability of receiver
private:  
     EthStruct1 A;
     EthStruct2 B;
     EthStruct3 C;
;

【讨论】:

请问这是什么答案?!?除了您过于宽泛的观点之外,您能否提出一个观点(工作代码示例)。回答一个不清楚的问题不应该导致一个更不清楚的答案! 这对于任何了解 C++ 的人来说都是一个明确的答案。【参考方案2】:

声明一个字节数组,其大小是三个结构的大小之和。然后将每个结构的原始字节复制到需要的数组中。然后根据需要使用数组。

struct ethernet

    ...
;

struct tcp

    ...
;

struct ip

    ...
;

ethernet e;
tcp t;
ip i;

unsigned char arr[sizeof(e)+sizeof(t)+sizeof(i)];
memcpy(&arr[0], &e, sizeof(e)];
memcpy(&arr[sizeof(e)], &t, sizeof(t)];
memcpy(&arr[sizeof(e)+sizeof(t)], &i, sizeof(i)];

或者:

struct ethernet

    ...
;

struct tcp

    ...
;

struct ip

    ...
;

struct pkt

    ethernet e;
    tcp t;
    ip i;
;

ethernet e;
tcp t;
ip i;

unsigned char arr[sizeof(pkt)];
pkt *p = (pkt) &arr[0];
p->e = e;
p->t = t;
p->i = i;

【讨论】:

非常感谢,您的第一个回答帮助我为 Windows Biometric Framework 创建了 WINBIO_BIR 记录,因为我无法创建新的父结构。【参考方案3】:

在将结构转换为字节数组时,我喜欢使用union。确保您的编译器使用单字节结构对齐...对于 Windows 编译器,我知道您可以使用 #pragma pack(push,1) 启动它并使用 #pragma pack(pop) 终止。我将在我的示例中使用这种方式。

#pragma pack(push,1) // start single-byte struct alignment
struct EthernetInfo

    // data here
;
struct TCPInfo

    // data here
;
struct IPInfo

    // data here
;

union Packet

    struct 
        struct EthernetInfo ethernetInfo;
        struct TCPInfo      tcpInfo;
        struct IPInfo       ipInfo;
     AsPacket;
    unsigned char AsBytes[sizeof(EthernetInfo) + sizeof(TCPInfo) + sizeof(IPInfo)];
;
#pragma pack(pop) // revert to whatever struct alignment was in use before

【讨论】:

以上是关于在 C++ 中加入结构? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在nodejs中加入2图像[关闭]

如何在文件夹opencv&&qt c++中加载图像[关闭]

在 Go 中加载动态 yaml 结构 [关闭]

在 R 中加载后,我应该如何关闭 hdf5 文件?

IIS 7 应用程序池自动回收关闭的解决方案

如何使用 FBX SDK 在 fbx 文件中加载嵌入的纹理? [关闭]