我正在尝试为具有动态有效负载长度的数据包创建一个结构,并由头结构(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;
答案 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创建的结构中新读取数据的指针。如果您正在阅读这样的多个项目,那么您可以继续阅读下一个结构,然后阅读数据,依此类推。