结构C内的动态可变长度

时间:2012-03-28 01:19:57

标签: c

我正在尝试为具有动态有效负载长度的数据包创建一个结构,并由头结构(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;

3 个答案:

答案 0 :(得分:3)

您可以使用有时称为“弹性数组”的构造。 (或者@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;   

这种类型的结构需要动态分配,因为您需要手动为有效负载腾出足够的空间。

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

答案 1 :(得分:2)

将有效负载改为指针,并根据标头字段中LEN的值在运行时分配它。

答案 2 :(得分:0)

您需要在结构中包含长度,而不是数据。根据您的工作情况,您可以采用不同的方式处理数据。结构应该包含指向数据的指针,但是在序列化反序列化结构时必须处理它。也就是说,当你重读它时,指针就没什么意义了。

所以你写出结构包括数据字段的大小,然后输出数据字段。当你读回来时,你fscanf结构,然后从流中读取结构告诉你的字节大小并将其作为数据存储,然后最终存储指向使用fscanf创建的结构中新读取数据的指针。如果您正在阅读这样的多个项目,那么您可以继续阅读下一个结构,然后阅读数据,依此类推。