【问题标题】:Dynamic variable length inside a structure C结构 C 内的动态可变长度
【发布时间】:2012-03-28 01:19:57
【问题描述】:

我正在尝试为具有动态有效负载长度并由标头结构 (LEN) 中的变量确定的数据包创建结构。

我不确定如何正确执行此操作,并且对我遇到的一些示例感到困惑。波纹管是我将使用的基础结构。 谢谢。

struct packet
{
    unsigned char payload;
    unsigned int CRC : 16;

    struct header
    {
        unsigned char SRC;
        unsigned char DST;
        unsigned char NS : 3;       //3 bits long
        unsigned char NR : 3;
        unsigned char RSV : 1;      //1 bit long
        unsigned char LST : 1;
        unsigned char OP;
        unsigned char LEN;
    } HEADER;

};

struct packet PACKET;

【问题讨论】:

  • 确保您接受最有帮助的答案。
  • 每次接收到新数据包时,LEN 都会发生变化,从而导致负载每次都动态变化。
  • 访问这个喜欢学习如何[接受答案] [meta.stackexchange.com/a/65088]

标签: c


【解决方案1】:

您可以使用有时称为“可拉伸数组”的构造。 (或者正如@Jerry Coffin 指出的那样,一个“灵活的数组成员”)可变长度的有效负载需要在末尾:

struct packet
{
    struct header
    {
        unsigned char SRC;
        unsigned char DST;
        unsigned char NS : 3;       //3 bits long
        unsigned char NR : 3;
        unsigned char RSV : 1;      //1 bit long
        unsigned char LST : 1;
        unsigned char OP;
        unsigned char LEN;
    } HEADER;
     unsigned int CRC : 16;
     unsigned char payload[1];  //STRETCHY.
};

struct packet PACKET;   

这种结构需要动态分配,因为你需要手动为payload腾出足够的空间。

PACKET * p = malloc( sizeof(PACKET)+payloadLength*sizeof(char) );
p->HEADER->LEN = payloadLength;
//fill in rest of header here.
memcpy(p->payload, incomingData, payloadLength);

【讨论】:

  • 我第一次听说“弹性阵列”。这通常称为“struct hack”,或(在 C99 中)“灵活数组成员”。对于灵活的数组成员,您不包含下标,因此它只是 unsigned char payload[];
  • 这就是我说“有时调用”的原因。我认为我商店的昵称并不普遍。另外,我认为 C99 之前需要下标
  • 我相信你在所有方面都是正确的。如果她/他有这样的意愿,我可能什至不会提出它,除非为 OP 提供一些东西来提供给 Google。
  • “另外,请记下术语“可拉伸数组”。我喜欢。我想在谈话中更频繁地使用它。” (向梅尔切特将军道歉)
【解决方案2】:

将payload改为指针,并在运行时根据header字段中LEN的值进行分配。

【讨论】:

  • LEN 会被传入的数据包更改,具体取决于该数据包的大小。
  • 每当标头长度发生变化时,您都需要手动调整有效负载的大小。它将不会仅根据更改标头长度来动态调整大小。
【解决方案3】:

您需要在结构中包含长度,而不是数据。根据您在做什么,您会以不同的方式处理数据。该结构可能应该包含一个指向数据的指针,但是当您序列化反序列化结构时,您必须处理这个问题。那就是当你读回指针时,指针将毫无意义。

所以你先写出结构体,包括数据字段的大小,然后再写出数据字段。当您读回它时,您 fscanf 结构,然后读取结构告诉您从流中读取的字节大小并将其存储为您的数据,然后最后将指向新读取数据的指针存储在使用 fscanf 创建的结构中.如果您正在阅读这样的多个项目,您可以继续阅读下一个结构,然后是数据等等。

【讨论】:

    猜你喜欢
    • 2015-08-09
    • 1970-01-01
    • 2014-11-14
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多