在 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++ 中加入结构? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章