【问题标题】:Filling up a field inside a struct填充结构内的字段
【发布时间】:2012-01-26 20:29:26
【问题描述】:

我正在尝试填充结构内的一个字段,但对如何执行此操作有点困惑: 以下是结构:

struct ofp_packet_out {
    struct ofp_header header;
    uint32_t buffer_id;           /* ID assigned by datapath (-1 if none). */
    uint16_t in_port;             /* Packet's input port (OFPP_NONE if none). */
    uint16_t actions_len;         /* Size of action array in bytes. */
    struct ofp_action_header actions[0]; /* Actions. */
     uint8_t data[0];         /* Packet data.  The length is inferred
                                     from the length field in the header.
                                     (Only meaningful if buffer_id == -1.) */
};
OFP_ASSERT(sizeof(struct ofp_packet_out) == 16);

我要填写的字段是 uint8_t data[0]。这将是一个 char 数组,假设 我们有一个缓冲区

char * buf[150]={some data};

p_action_header actions[0]的字段结构体;是一个动作数组,可以用来追加多个动作,一个例子是

typedef struct ofp_action_output ofp_action_output;
ofp_action_output  action = *((ofp_action_output*)ofm.actions);
        memset(&action, 0, sizeof(ofp_action_output));
        action.type = htons(OFPAT_OUTPUT);
        action.len = htons(sizeof(ofp_action_output));
        action.port = htons(OFPP_FLOOD);
        action.max_len = htons(0);

其中 ofm 是 struct some_struct ofm;,其中包含字段操作。 我正在努力的是如何在 uint8_t data[0]; 领域做同样的事情 正如我所提到的,我将所需的数据提取到一个数组中,我需要将这些数据放入 到struct字段uint8_t data[0];这样我从交换机收到的数据可以发回给它。

如何将其附加到必填字段?所有帮助将不胜感激。 谢谢。

【问题讨论】:

  • 您想要 C 答案还是 C++ 答案?不要标记两种语言。
  • 撇开零长度数组的智慧和可移植性不谈,你不能拥有多个数组;只有结构中的最后一个元素是零长度数组才有意义。
  • 我更喜欢 C 答案。事实上,该结构实际​​上是网络交换机中内置的 OPENFLOW 规范的实现。当交换机无法缓冲数据包数据时,它会将其发送到我们的程序(整个数据。),我将数据存储在我提到的 char 数组中,现在我需要将该数据附加到字段中,如您所见我们可以通过在标头长度字段中指定大小来将所谓的零大小数据数组的大小设置为我们想要的任何值。
  • 您可能还想将attribute((packed)) 添加到结构的声明中,以防止 gcc 插入额外的填充字节以实现最佳成员对齐。当然,这仅在您想将指向该结构的指针直接传递给 read() 或 write() 之类的函数时才有效。

标签: c


【解决方案1】:
#include <string.h>
ofp_packet_out myobj;
memcpy(myobj.data, buf, 150);

不是很安全,但你似乎有一个 C 不能。

这不会附加它,而是覆盖它。要附加到某个字段,您必须向我显示该字段,因为您当前已将其注释掉。您还需要在目标中附加到的位置。

首先,两个数组/缓冲区都必须具有指定的容量,即 150 字节。

请原谅,您是否希望在没有目标地址的字段句柄的情况下复制到该结构中?这将需要更多的工作,因为它取决于您的编译器设置了多少空间用于前面的字段。由于内部填充和字对齐,求和 sizeof(objname.fieldname) 将不起作用。

【讨论】:

  • 这就是问题所在,我熟悉 memcpy 过程,但我们不能只访问结构内部的字段吗?我们不是必须先指向它,比如 ofp_packet_out.data 之类的吗?
  • 我不明白,你不是遗漏了你提出的方程的一些参数吗?老实说,我不明白为什么你有一个零长度数组 struct ofp_action_header actions[0]; 并且没有你所暗示的目的地的字段句柄。
  • @Abdullah,是的,您可以访问结构内的字段。我不知道有 2 个零长度数组的当前规则,这似乎行不通。如果您知道字段名称,正如您所声称的,您可以访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2019-11-10
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
相关资源
最近更新 更多